Ich arbeite mit etwas Code, der 3 Ebenen der Klassenvererbung hat. Von der abgeleiteten Klasse auf der niedrigsten Ebene, was ist die Syntax zum Aufrufen einer Methode 2 Ebenen die Hierarchie, z. ein super.super Anruf? Die "mittlere" Klasse implementiert nicht die Methode, die ich aufrufen muss.So rufen Sie die Supermethode auf?
Antwort
Nun, das ist eine Möglichkeit, es zu tun:
class Grandparent(object):
def my_method(self):
print "Grandparent"
class Parent(Grandparent):
def my_method(self):
print "Parent"
class Child(Parent):
def my_method(self):
print "Hello Grandparent"
Grandparent.my_method(self)
Vielleicht nicht das, was Sie wollen, aber es ist die beste Python hat, wenn ich nicht irre. Was du fragst, klingt antipythonisch und du müsstest erklären, warum du es für uns machst, um dir die glückliche Python-Art zu geben, Dinge zu tun.
Ein weiteres Beispiel vielleicht, was Sie (aus Ihren Kommentaren) wollen:
class Grandparent(object):
def my_method(self):
print "Grandparent"
class Parent(Grandparent):
def some_other_method(self):
print "Parent"
class Child(Parent):
def my_method(self):
print "Hello Grandparent"
super(Child, self).my_method()
Wie Sie sehen können, Parent
nicht my_method
nicht implementiert, aber Child
noch Super kann bei dem Verfahren zu erhalten, die Parent
„sieht ", dh Grandparent
's my_method
.
Ich glaube nicht, dass Sie verschachtelte "Super" -Aufrufe trotzdem tun können, weil der Typ "Super" wäre. –
In meinem Fall implementiert die Parent-Klasse my_method nicht, und ich möchte sie nicht hinzufügen, nur um den untergeordneten Aufruf zum Funktionieren zu bringen. – SeanLabs
Sie müssen nicht, mittlere Klasse erbt Methoden von Elternklassen, also würde 'super(). Method()' funktionieren. –
Wenn Sie zwei Ebenen sichern möchten, warum nicht einfach tun
class GrandParent(object):
def act(self):
print 'grandpa act'
class Parent(GrandParent):
def act(self):
print 'parent act'
class Child(Parent):
def act(self):
super(Child.__bases__[0], self).act()
print 'child act'
instance = Child()
instance.act()
# Prints out
# >>> grandpa act
# >>> child act
Sie können die Überprüfung etwas defensiver hinzufügen wie wenn __bases__
leer ist oder Schleifen über sie, wenn Ihr Bürgertums Mehrfachvererbung haben. Das Verschachteln von Super funktioniert nicht, da der Super-Typ nicht der übergeordnete Typ ist.
Niemals, * jemals *, benutze 'self .__ class__' in' super() '. Nicht einmal um an die Basen zu kommen. 'self .__ class__' ist ** nicht immer die Klasse, für die Sie die Methode ** definiert haben, es könnte eine Unterklasse sein. Wenn Sie zwei weitere Vererbungsebenen hinzufügen, haben Sie jetzt eine Endlosschleife. –
In Ihrem Fall, wie my_method
Funktion der Klasse C
von A
aufrufen.
Sie können dies auf zwei Arten statisch und dynamisch tun.
dynamisch
class C(object):
def my_method(self):
print "in function c"
class B(C):
def my_method(self):
print "in function b"
class A(B):
def my_method(self):
# Call my_method from B
super(A, self).my_method()
# This is how you can call my_method from C here ?
super((self.__class__.__bases__)[0], self).my_method()
obj_a = A()
obj_a.my_method()
Hier (self.__class__.__bases__
) werden Basisklassen von A
in Tupel Typ das ist zurückgeben, warum ich den 0-ten Index nahm. So gibt es die Klasse B
so B
Klasse als ein Argument in Super zurückgegeben wird my_method
Funktion der Basisklasse von B
Klasse.
Statisch
class C(object):
def my_method(self):
print "in function c"
class B(C):
def my_method(self):
print "in function b"
class A(B):
def my_method(self):
# Call my_method from B
super(A, self).my_method()
# This is how you can call my_method from C here ?
obj_a = A()
super(A, obj_a).my_method() # calls function of class B
super(B, obj_a).my_method() # calls function of class C
Niemals, * jemals *, benutze 'self .__ class__' in' super() '. Nicht einmal um an die Basen zu kommen. 'self .__ class__' ist ** nicht immer die Klasse, für die Sie die Methode ** definiert haben, es könnte eine Unterklasse sein. Wenn Sie zwei weitere Vererbungsebenen hinzufügen, haben Sie jetzt eine Endlosschleife. –
ein bisschen melodramatisch sind wir? – dopatraman
Dies funktioniert für mich:
class Grandparent(object):
def my_method(self):
print "Grandparent"
class Parent(Grandparent):
def my_method(self):
print "Parent"
class Child(Parent):
def my_method(self):
print "Hello Grandparent"
super(Parent, self).my_method()
Dies ist wahrscheinlich die Antwort, die als die richtige Antwort markiert werden muss – nesdis
- 1. So rufen Sie die validateValue-Methode auf
- 2. So rufen Sie die WCF-URL auf?
- 3. So rufen Sie Monitor.TryEnter auf
- 4. So rufen Sie Tooltip beim Klicken auf die Schaltfläche auf
- 5. py2neo: So rufen Sie die Knotenbezeichnung ab
- 6. So rufen Sie das SSIS-Paket auf
- 7. So rufen Sie den Hintergrundthread auf
- 8. So rufen Sie die aufgelöste URL
- 9. So rufen Sie DeviceIOControl-Code asynchron auf?
- 10. So rufen Sie UDF in DataStage auf?
- 11. So rufen Sie Aktionen zwischen Klassen auf?
- 12. So rufen Sie ein Bool auf Knopfdruck
- 13. So rufen Sie eine Vorlagenmethode auf?
- 14. So rufen Sie setNeedsDisplayInRect mit performSelectorOnMainThread auf?
- 15. So rufen Sie ViewChild in Runtime auf?
- 16. So rufen Sie Path.Combine von MSBuild auf?
- 17. So rufen Sie JavaScript in XML auf?
- 18. So rufen Sie ein Array auf?
- 19. So rufen Sie NetworkStream.Read() ohne Blockierung auf?
- 20. So rufen Sie NetSuite-Restlets extern auf?
- 21. So rufen Sie Thickbox mit JavaScript auf
- 22. So rufen Sie Attributwerte zu JavaScript auf
- 23. So rufen Sie die Originaldatei ab
- 24. So rufen Sie die benutzerdefinierte Abfrage-URL mit Restangular auf?
- 25. So rufen Sie die Bootstrap-Bibliothek in Laravel auf?
- 26. So rufen Sie die setState-Funktion onClick ES6 auf
- 27. So rufen Sie die Klassenmethode mit variablen Argumenten auf
- 28. So rufen Sie die WinAPI-Funktion SetDllDirectory() in Delphi auf?
- 29. So rufen Sie die Liste der verfügbaren Benachrichtigungstöne auf Android
- 30. So rufen Sie die Vorlagendatei in meinem Controller auf?
Warum brauchen Sie das? Ein einziger 'super()' Aufruf sollte ausreichen, außer Sie haben die Methode in der Mittelklasse überschrieben. In diesem Fall sollte sich die Mittelklasse darum kümmern, die Methode von super() richtig zu benutzen. –
Wenn die Mittelklasse diese Methode nicht implementiert, rufen Sie einfach 'super() auf.() 'sollte es funktionieren, weil durch die Vererbung Ihre Mittelklasse die Methoden von der Superklasse erben würde –
Meinst du, du willst eine Implementierung im MRO * überspringen *? – jonrsharpe