Bedenken Sie, dass ich in Python den folgenden Code habe:
>>> 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?
Wie initialisiere ich das SuperClass __init__
in der Unterklasse? Ich folge dem Python-Tutorial und es behandelt das nicht. Bei der Suche bei Google habe ich mehr als eine Möglichkeit gefunden. Was ist die Standardmethode, um damit umzugehen?
__init__
.Ab Python 3.5.2 können Sie Folgendes verwenden:
https://docs.python.org/3/library/functions.html#super
quelle
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 undself
super, um die gebundene__init__
Methode nachzuschlagen :In Python 3 gibt es ein wenig Magie, die die Argumente
super
unnötig macht - und als Nebeneffekt funktioniert es etwas schneller:Wenn Sie das übergeordnete Element wie folgt fest codieren, können Sie keine kooperative Mehrfachvererbung verwenden:
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
odertuple
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__
mitcls
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__
übersuper
als auch in Ihrer Basisklasse. Wenn Sie also beide Methoden verwenden:Python 3 umgeht ein wenig die Verrücktheit der Superaufrufe, die durch
__new__
eine statische Methode verursacht werden, aber Sie müssen trotzdemcls
an die nicht gebundene__new__
Methode übergeben:quelle