@mizantrol: co chcesz osiągnąć? Obie funkcje maja odmienny scope i nie - nie zadziała bez definicji klasy.
__init__() jest specjalna funkcja i definiuje argumenty wymagane podczas iniicjalizacji instancji obiektu. Wtedy mozesz uzywac atrybutow takiej instancji z zaprogramowanymi wartosciami. Wewnatrz klasy wlasciwe jej metody i atrybuty adresujesz poprzez self. Co oznacza, ze chcesz uzyc atrybutow tej konkretnej instancji.
@mizantrol: Sa dwa podejscia. Mozesz uzyc __init__() i kazac definiowac instancje wg przepisu z init (wtedy konstruktor bedzie wymagal tych wlasnie atrybutow na dzien dobry).
Druga opcja, to zostawic init pusty, albo go nie definiowac nawet i dynamicznie dodawac atrybuty i ich wartosci do instancji.
1. Podejscie nr. 1:
class Test: ____def __init__(self, name) ________self.name = name 2. Podejscie nr. 2
class Test: ____pass test = Test() test.name = "adam" print(test.name)
czyli jak chcę używać zmiennych z init w metodzie to muszę zrobić:
self.zmienna = zmienna
i w metodzie używać self.zmienna? muszę to podawać jako argument metody?
@mizantrol: Chodzi o podstawy OOP - obiektowego paradygmatu. Tworzysz "obiekty", czyli twory będące polaczeniem danych (atrybutów) i. funkcji, operacji, które można na tych danych przeprowadzić. Jeżeli masz klasę Test, która wymaga podczas inicjalizacji podania atrybutu "name", to znaczy, że możesz stworzyć wiele różnych obiektów według
@arysto2011: czyli jak wymagam w _init_ argumentów to potem mogę dowolnie ich używać w metodach klasy po przydzieleniu self.argument. i w metodach jedynie self jako argument?
@mizantrol: Możesz, ale to nie będzie zmienna z __init__, scope zawęża się do metody i będzie rozpatrywał pewną zmienną (którą musisz podać) wewnątrz tej funkcji.
Ci ludzie promujący CPK a zwłaszcza ci którzy pojawili się dopiero po wyborach wydają się coraz bardziej groteskowi i chyba też zdesperowani próbując utrzymać przekaz. Brakuje tylko husarskich skrzydeł (ʘ‿ʘ)
jeśli tworzymy instancje klasy to:
self.name = name
robimy po to, żeby mieć dostęp do tego name poprzez zmienna.name ?
to mogę potem w metodzie klasy:
def metoda(self, zmienna):
?
class Test:
____def __init__(self, name)
________self.name = name
test = Test("przyklad")
print(test.name)
przyklad
https://medium.com/swlh/oop-basics-class-vs-instance-attributes-in-python3-7a6cfb577282
czy to będzie działać?
https://pastebin.com/dQtX7Djz
__init__()
jest specjalna funkcja i definiuje argumenty wymagane podczas iniicjalizacji instancji obiektu. Wtedy mozesz uzywac atrybutow takiej instancji z zaprogramowanymi wartosciami. Wewnatrz klasy wlasciwe jej metody i atrybuty adresujesz poprzezself
. Co oznacza, ze chcesz uzyc atrybutow tej konkretnej instancji.czyli jak chcę używać zmiennych z _init_ w metodzie to muszę zrobić:
self.zmienna = zmienna
i w metodzie używać self.zmienna? muszę to podawać jako argument metody?
https://pastebin.com/SA3C0XAZ
__init__()
i kazac definiowac instancje wg przepisu z init (wtedy konstruktor bedzie wymagal tych wlasnie atrybutow na dzien dobry).Druga opcja, to zostawic init pusty, albo go nie definiowac nawet i dynamicznie dodawac atrybuty i ich wartosci do instancji.
1. Podejscie nr. 1:
class Test:
____def __init__(self, name)
________self.name = name
2. Podejscie nr. 2
class Test:
____pass
test = Test()
test.name = "adam"
print(test.name)
dodajemy do instancji klasy self.name = "adam" tak?
@mizantrol: Chodzi o podstawy OOP - obiektowego paradygmatu. Tworzysz "obiekty", czyli twory będące polaczeniem danych (atrybutów) i. funkcji, operacji, które można na tych danych przeprowadzić. Jeżeli masz klasę Test, która wymaga podczas inicjalizacji podania atrybutu "name", to znaczy, że możesz stworzyć wiele różnych obiektów według
i w metodach jedynie self jako argument?
@mizantrol: Możesz, ale to nie będzie zmienna z
__init__
, scope zawęża się do metody i będzie rozpatrywał pewną zmienną (którą musisz podać) wewnątrz tej funkcji.W uproszczeniu - tak.
def _init(self, name, word):
self.name = name
self.word = word
to w
metoda(self):
self.name = "cokolwiek"
to "cokolwiek" istnieje tylko wewnątrz metoda(self), a self.name w init_ zostaje takie jakie było przydzielone podczas tworzeniu instancji klasy?
self.name
- atrybut dla całej instancji.zmienna = Klasa("jeden", "dwa")
print(zmienna.name)
# da "jeden"
natomiast gdy dam potem:
zmienna.metoda()
print(zmienna.name)
# to da mi "cokolwiek"
?
To samo będzie jak zrobisz:
zmienna.name = "znowucosinnego"