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 super
Objekt, 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 self
super, 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 super
unnö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 str
oder tuple
oder 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 cls
explizit.
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 super
als 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 cls
an 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')