Dlaczego faktycznie konstruktorzy są nazywani „konstruktorami”? Jaki jest ich cel i czym różnią się od metod w klasie?
Czy __init__
w klasie może być więcej niż jeden ? Wypróbowałem następujące, czy ktoś może wyjaśnić wynik?
>>> class test:
def __init__(self):
print "init 1"
def __init__(self):
print "init 2"
>>> s=test()
init 2
Wreszcie, czy __init__
operator jest przeciążeniem?
__init__
jest inicjatorem . Pyton konstruktor jest__new__
. Python używa automatycznej dwufazowej inicjalizacji -__new__
zwraca prawidłowy, ale (zwykle) niezamieszkany obiekt (patrzbool
przykł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.Odpowiedzi:
W Pythonie nie ma przeciążenia funkcji, co oznacza, że nie można mieć wielu funkcji o tej samej nazwie, ale z różnymi argumentami.
W przykładowym kodzie nie przeciążasz
__init__()
. Dzieje się tak, że druga definicja ponownie wiąże nazwę__init__
z nową metodą, sprawiając, że pierwsza metoda jest niedostępna.Jeśli chodzi o twoje ogólne pytanie dotyczące konstruktorów, Wikipedia jest dobrym punktem wyjścia. W przypadku rzeczy specyficznych dla Pythona bardzo polecam dokumentację Pythona .
źródło
__init__
będzie to, co kończy się na zajęciach.Dlaczego faktycznie konstruktorzy są nazywani „konstruktorami”?
Konstruktor (o nazwie
__new__
) tworzy i zwraca nowe wystąpienie klasy. ZatemC.__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 nowejC
instancji.Celem inicjatora
C.__init__
jest zdefiniowanie niestandardowej inicjalizacji każdej instancji lubC
po jej utworzeniu.Na przykład Python umożliwia:
Ale jeśli chcesz, aby każda instancja
Test
miała atrybutx
równy 10, możesz umieścić ten kod w środku__init__
: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
x
atrybutu, wszystko, co musisz zrobić, to przekazać tę wartość jako argument do__init__
: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ę :)
źródło
Klasy to po prostu plany tworzenia obiektów z. Konstruktor to kod, który jest uruchamiany za każdym razem, gdy tworzysz obiekt. Dlatego nie ma sensu mieć dwóch konstruktorów. Dzieje się tak, że drugi nadpisuje pierwszy.
Zwykle używasz ich do tworzenia zmiennych dla tego obiektu w następujący sposób:
Więc to, co możesz wtedy zrobić, to utworzyć obiekt z tej klasy w następujący sposób:
Obiekt testowy będzie miał wtedy obiekt o nazwie,
some_value
który w tym przykładzie będzie miał wartość 5.Ale nie musisz ustawiać wartości dla każdego obiektu, tak jak to zrobiłem w mojej próbce. Możesz też zrobić tak:
wtedy wartość some_value będzie wynosić 5 i nie musisz jej ustawiać podczas tworzenia obiektu.
>>> i ... w mojej próbce nie jest to, co piszesz. Tak by to wyglądało w pigułce ...
źródło
współkonstruktory są wywoływane automatycznie podczas tworzenia nowego obiektu, w ten sposób „konstruując” obiekt. Powodem, dla którego możesz mieć więcej niż jeden init, jest to, że nazwy są po prostu odwołaniami w Pythonie i możesz zmienić, do czego odwołuje się każda zmienna, kiedy tylko chcesz (stąd dynamiczne pisanie)
w definicji klasy zachowuje po prostu późniejszą
źródło
W Pythonie nie ma pojęcia przeciążania metod. Ale możesz osiągnąć podobny efekt, określając argumenty opcjonalne i słowa kluczowe
źródło