2017-02-21 5 views
1

Angenommen Klasse A von B geerbt und B geerbt von C.Wie für den Zugriff auf die Vorfahren eines Objekts in Python

class C(): 
    def my_method(self): 
     pass 

class B(C): 
    def my_method(self): 
     pass 

class A(B): 
    def my_method(self): 
     # Call my_method from B 
     super(A, self).my_method() 
     # How can I call my_method from C here ? 

Frage: Wie kann ich my_method von C nennen?

+0

bedeuten Sie die übergeordnete Klasse von 'SomeClass'? – Dschoni

+0

Klingt wie ein [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Im Allgemeinen sollten Sie nicht auf bestimmte Vorfahren zugreifen müssen. Lassen Sie "super" herausfinden, auf wen Sie zugreifen können. Das ist der springende Punkt bei ["MRO" (Reihenfolge der Methodenauflösung)] (https://www.python.org/download) /releases/2.3/mro/). – MSeifert

+0

Beachten Sie, dass nur ein Objekt mit 'A()' erstellt wurde. Dieses Objekt ist eine Instanz aller seiner Superklassen, aber es werden keine individuellen Objcets für die Elternklassen erstellt. – kazemakase

Antwort

1

Sie können als Argument übergeben mit self durch den Aufruf der ‚ungebunden‘ Methode direkt, C ‚s my_method() Methode rufen Sie einfach an. Zum Beispiel:

class C(object): 
    def my_method(self): 
     print('C.my_method') 

class B(C): 
    def my_method(self): 
     print('B.my_method') 

class A(B): 
    def my_method(self): 
     print('A.my_method') 
     super(A, self).my_method() # calls B.my_method(self) 
     C.my_method(self)   # calls C.my_method(self) 

a = A() 
a.my_method() 

Sobald er ausgeführt wird, dass die folgenden gedruckt wird (beachten Sie die (object) für super() erforderlich ist, auf Python 2.x zu arbeiten):

A.my_method 
B.my_method 
C.my_method 

jedoch, wie andere haben darauf hingewiesen, Dies ist möglicherweise nicht der beste Weg, um zu erreichen, was Sie wollen. Können Sie ein konkretes Beispiel dafür geben, was Sie im Kontext erreichen wollen?

+0

Eigentlich möchte ich my_method in Klasse A überschreiben, mit anderen Worten, ich werde einige Funktionen zu my_method der Klasse C hinzufügen, nicht Klasse B. –

0

Sie können die vollständige Abstammung eines Objekts zugreifen seine __mro__ Attribut:

In [3]: KeyError.__mro__ 
Out[3]: (KeyError, LookupError, StandardError, Exception, BaseException, object) 
0

Vor allem, wenn Sie Super-Funktion verwenden wollen, dann müssen Sie die Basisklasse als Objekt verwenden, wie diese

class c(object): 
    pass 

Denn Super-Funktionsunterstützung in nur neuer Art der Programmierung von Python nur.

Jetzt kommt, wie auf die Funktion der Basisklasse der Basisklasse zugreifen. In Ihrem Fall, wie my_method Funktion der Klasse C von A aufgerufen werden.

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__) kehrt Basisklassen von A in Tupel Typ ist, warum ich den Index 0. Nahm. Also gibt es die Klasse B zurück, so dass sie die B-Klasse als ein Argument in super hat, sie wird die Funktion my_method der Basisklasse der Klasse b zurückgeben.

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 A 
Verwandte Themen