Dlaczego faktycznie konstruktorzy są nazywani „konstruktorami”?
Konstruktor (o nazwie __new__) tworzy i zwraca nowe wystąpienie klasy. Zatem C.__new__metoda klasy jest konstruktorem dla klasy C.
Metoda C.__init__instancji jest wywoływana w określonej instancji po jej utworzeniu w celu jej zainicjowania przed przekazaniem z powrotem do obiektu wywołującego. Ta metoda jest więc inicjatorem dla nowych instancji C.
Czym różnią się od metod w klasie?
Jak podano w oficjalnej dokumentacji, wywoływana__init__ jest po utworzeniu instancji . Inne metody nie otrzymują tego leczenia.
Jaki jest ich cel?
Celem konstruktora C.__new__jest zdefiniowanie niestandardowego zachowania podczas tworzenia nowej Cinstancji.
Celem inicjatora C.__init__jest zdefiniowanie niestandardowej inicjalizacji każdej instancji lub Cpo jej utworzeniu.
Na przykład Python umożliwia:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Ale jeśli chcesz, aby każda instancja Testmiała atrybut xrówny 10, możesz umieścić ten kod w środku __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
Każda metoda instancji (metoda wywoływana na konkretnym wystąpieniu klasy) przyjmuje instancję jako pierwszy argument. Ten argument jest konwencjonalnie nazwany self.
__new__Zamiast tego metody klas, takie jak konstruktor , otrzymują klasę jako pierwszy argument.
Teraz, jeśli chcesz mieć niestandardowe wartości dla xatrybutu, wszystko, co musisz zrobić, to przekazać tę wartość jako argument do __init__:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
Mam nadzieję, że pomoże Ci to rozwiać pewne wątpliwości, a skoro na inne pytania otrzymałeś już dobre odpowiedzi, na tym zakończę :)
__init__jest inicjatorem . Pyton konstruktor jest__new__. Python używa automatycznej dwufazowej inicjalizacji -__new__zwraca prawidłowy, ale (zwykle) niezamieszkany obiekt (patrzboolprzykład przeciwny), który następnie__init__automatycznie go wywołał. Pozwala to uniknąć problemów, jakie języki takie jak C ++ mają z częściowo skonstruowanymi obiektami - nigdy nie masz takiego w Pythonie (chociaż może być częściowo zainicjowany). Będziesz prawie nigdy nie trzeba zastąpić zarówno__new__i__init__na zajęciach.