Dzień dobry, przepraszam ale jak to zrobić, aby funkcja nadawała nazwę nowo powstającym obiektom?
Nie rozumiem?
Jaka nazwe? Pole name? Etykiete zmiennej?
To nie nadawanie nazwy jest twoim problem tylko scope. Zmienne są widoczne tylko w pewnym zakresie. Zmienna utworzona wewnatrz funkcji NIE BĘDZIE dostępna poza tą funkcją i tyle. Możesz z funkcji coś zwrócić
i wtedy będzie dostępne, w zakresie bloku do którego ją zwróciłeś.
def funkcja():
x = 1 # to nie będzie dostępne jak wyjdziemy z funkcji
y = 2 # to nie będzie dostępne jak wyjdziemy z funkcji
z = 3 # to nie będzie dostępne jak wyjdziemy z funkcji
return z # ta wartość będzie dostępna jeśli gdzieś ją przypiszesz
def main():
v = funkcja() # przypisujemy wynik, więc ta wartość jest dostępna w tym scope
Klasa Produkt(), posiada takie atrybuty jak: nazwa; nrKatalogowy itp. Chciałbym aby funkcja tworzyła nowe obiekty o różnych nazwach np nrKatalowowy = Produkt().
To najlepiej konstruktorem (__init__
)
class Dupa():
def __init__(self):
print("doopa")
nazwa = "prod"
def tworz(nazwa):
nazwa = Dupa()
return nazwa
lista = []
lista.append(tworz(nazwa))
class Dupa(): # serio? XD
def __init__(self, name):
self.name = name
wolowa = Dupa('Wolowa')
print(wolowa.name) # 'Wolowa'
Wietrzę tu problem XY, Opisz dokładniej wszystko, co Chcesz uzyskać.
lion137 napisał(a):
Wietrzę tu problem XY, Opisz dokładniej wszystko, co Chcesz uzyskać.
A ja patrzac na kod wietrze pierwszy dzien programowania : |
Moj program pobiera z pliku csv dane o pewnych produktac, aby później je automatycznie dodawać do sklepu internetowego i chciałbym aby z każdego pobranego wiersza pobrał odpowiednie dane i porobił z tego obiekty o nazwach będących ich numerami katalogowymi.
class Produkt():
def __init__(self):
self.nrKatalogowy = ''
self.nazwa = ''
self.opis = ''
self.cena = 0
self.producent = ''
self.kategoria = ''
self.podkategoria = ''
self.ost = ''
class Silnik():
def __init__(self):
self.nazwaPl = "/Users/____/PycharmProjects/selenium/e-sklep/___ict_JD.csv"
self.kolumny = []
self.produkty = []
self.plik = ''
self.wiersz = ''
self.nowy = ''
def naglowek(self):
plik = open(self.nazwaPl, 'r', encoding='utf-8-sig')
naglowek = plik.readline()
kolumny = naglowek.split(";")
self.kolumny = kolumny
self.plik = plik
def dodaj(self):
wiersz = self.plik.readline()
self.wiersz = wiersz.split(";")
self.nowy = kolumny[0]
def twor(self):
self.nowy = Produkt()
Mam wrażenie, że chcesz użyć słownika a nie listy. Słownik zawiera w sobie wartości o różnych nazwach (kluczach) właśnie:
https://docs.python.org/2/tutorial/datastructures.html#dictionaries
nazwa = "prod"
def tworz(nazwa):
nazwa = Dupa()
return nazwa
lista = []
lista.append(tworz(nazwa))
To tak nie działa, jak myślisz, że działa. Polecam zrobienie print(tworz(nazwa))
, wtedy zobaczysz, co ci naprawdę zwraca (instancję obiektu Dupa).
-
Nowotworzone obiekty możesz umieszczać w jakimś słowniku i tam przypisywać im nazwę.
-
Obiekty (i ich atrybuty, typu nazwa, cena, ...) możesz inicjować podczas tworzenia.
-
Możesz utworzyć obiekty i wrzucić je do "globalnego scope" pod jakąś zmyślną nazwą. Na Twoim etapie rozwoju nie jest to dobre rozwiązanie.
Przykład na 1,2,3:
class Produkt():
def _dummy(self):
self._properties = {
'nrKatalogowy': '',
'nazwa' : '',
'opis' : '',
'cena' : 0,
'producent': '',
'kategoria': '',
'podkategoria' : '',
'ost': '',
}
def __init__(self):
self._dummy()
def __init__(self,**kwargs):
self._dummy()
for k,v in kwargs.items():
if k in self._properties.keys():
self._properties[k] = v
else:
print("Warning: {} is not an attribute of {}. Ignoring value.".format(k,self.__class__.__name__))
p1 = Produkt(nazwa='Foobar',cena=123.45)
p2 = Produkt(nazwa='Baz',kategoria='CatX',ost='bar')
p3 = Produkt(nazwa='Baz',dupa=8)
print("P1 = {}".format(p1._properties))
print("P2 = {}".format(p2._properties))
print("P3 = {}".format(p3._properties))
mojeObiekty = {}
mojeObiekty['ala'] = p1
mojeObiekty['ola'] = p2
mojeObiekty['ela'] = p3
print("P1 = {}".format(mojeObiekty['ala']._properties))
print("P2 = {}".format(mojeObiekty['ola']._properties))
print("P3 = {}".format(mojeObiekty['ela']._properties))
globals()['produkt1'] = p1
globals()['produkt2'] = p2
globals()['produkt3'] = p3
print("P1 = {}".format(produkt1._properties))
print("P2 = {}".format(produkt2._properties))
print("P2 = {}".format(produkt3._properties))