Wie initialisiere ich die Basisklasse (Superklasse)?
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
Verwenden Sie ein superObjekt, um sicherzustellen, dass Sie die nächste Methode (als gebundene Methode) in der Reihenfolge der Methodenauflösung erhalten. In Python 2 müssen Sie den Klassennamen übergeben und selfsuper, um die gebundene __init__Methode nachzuschlagen :
class SubClass(SuperClass):
def __init__(self, y):
super(SubClass, self).__init__('x')
self.y = y
In Python 3 gibt es ein wenig Magie, die die Argumente superunnötig macht - und als Nebeneffekt funktioniert es etwas schneller:
class SubClass(SuperClass):
def __init__(self, y):
super().__init__('x')
self.y = y
Wenn Sie das übergeordnete Element wie folgt fest codieren, können Sie keine kooperative Mehrfachvererbung verwenden:
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
Beachten Sie, dass __init__möglicherweise nur zurückgegeben wirdNone - es ist beabsichtigt, das Objekt an Ort und Stelle zu ändern.
etwas __new__
Es gibt eine andere Möglichkeit, Instanzen zu initialisieren - und dies ist die einzige Möglichkeit für Unterklassen unveränderlicher Typen in Python. So ist es erforderlich , wenn Sie zu Unterklasse wollen stroder tupleoder ein anderes unveränderliches Objekt.
Sie könnten denken, es ist eine Klassenmethode, weil sie ein implizites Klassenargument erhält. Aber es ist eigentlich eine statische Methode . Sie müssen also rufen __new__mit clsexplizit.
Wir kehren in der Regel die Instanz aus __new__, so dass , wenn Sie dies tun, müssen Sie auch Ihre Basis ist nennen __new__über superals auch in Ihrer Basisklasse. Wenn Sie also beide Methoden verwenden:
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 umgeht ein wenig die Verrücktheit der Superaufrufe, die durch __new__eine statische Methode verursacht werden, aber Sie müssen trotzdem clsan die nicht gebundene __new__Methode übergeben:
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')