W Pythonie weźmy pod uwagę następujący kod:
>>> class SuperClass(object):
def __init__(self, x):
self.x = x
>>> class SubClass(SuperClass):
def __init__(self, y):
self.y = y
# how do I initialize the SuperClass __init__ here?
Jak zainicjować SuperClass __init__
w podklasie? Postępuję zgodnie z samouczkiem Pythona i nie obejmuje tego. Kiedy szukałem w Google, znalazłem więcej niż jeden sposób. Jaki jest standardowy sposób radzenia sobie z tym?
__init__
.Począwszy od Pythona 3.5.2, możesz użyć:
https://docs.python.org/3/library/functions.html#super
źródło
Użyj
super
obiektu, aby upewnić się, że otrzymasz następną metodę (jako metodę powiązaną) w kolejności rozwiązywania metod. W Pythonie 2 musisz przekazać nazwę klasy iself
super, aby wyszukać powiązaną__init__
metodę:W Pythonie 3 jest trochę magii, która sprawia, że argumenty są
super
niepotrzebne - i jako korzyść uboczna działa trochę szybciej:Zakodowanie rodzica w następujący sposób zapobiega korzystaniu z wielokrotnego dziedziczenia w trybie współpracy:
Zauważ, że
__init__
może tylko powrócićNone
- ma na celu modyfikację obiektu w miejscu.Coś
__new__
Istnieje inny sposób inicjowania instancji - i jest to jedyny sposób na podklasy niezmiennych typów w Pythonie. Więc nie jest to wymagane, jeśli chcesz podklasy
str
lubtuple
lub innego niezmiennego obiektu.Możesz pomyśleć, że jest to metoda klasowa, ponieważ pobiera niejawny argument klasy. Ale w rzeczywistości jest to metoda statyczna . Więc musisz jawnie zadzwonić
__new__
zcls
.Zwykle zwracamy instancję z
__new__
, więc jeśli to zrobisz, musisz również zadzwonić do swojej bazy przez__new__
viasuper
w swojej klasie bazowej. Więc jeśli używasz obu metod:Python 3 omija trochę dziwaczności super wywołań spowodowanych tym,
__new__
że jest metodą statyczną, ale nadal musisz przejśćcls
do metody niezwiązanej__new__
:źródło