Jak zainicjować klasę podstawową (super)?
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
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 i self
super, aby wyszukać powiązaną __init__
metodę:
class SubClass(SuperClass):
def __init__(self, y):
super(SubClass, self).__init__('x')
self.y = y
W Pythonie 3 jest trochę magii, która sprawia, że argumenty są super
niepotrzebne - i jako korzyść uboczna działa trochę szybciej:
class SubClass(SuperClass):
def __init__(self, y):
super().__init__('x')
self.y = y
Zakodowanie rodzica w następujący sposób zapobiega korzystaniu z wielokrotnego dziedziczenia w trybie współpracy:
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
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
lub tuple
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__
z cls
.
Zwykle zwracamy instancję z __new__
, więc jeśli to zrobisz, musisz również zadzwonić do swojej bazy przez __new__
via super
w swojej klasie bazowej. Więc jeśli używasz obu metod:
class SuperClass(object):
def __new__(cls, x):
return super(SuperClass, cls).__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super(SubClass, cls).__new__(cls)
def __init__(self, y):
self.y = y
super(SubClass, self).__init__('x')
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__
:
class SuperClass(object):
def __new__(cls, x):
return super().__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super().__new__(cls)
def __init__(self, y):
self.y = y
super().__init__('x')