9 Stimmen

Aufruf einer überschriebenen Methode aus der Basisklasse?

Eintauchen in Python -

Guido, der ursprüngliche Autor von Python, erklärt das Überschreiben von Methoden wie folgt: "Abgeleitete Klassen können Methoden ihrer Basisklassen außer Kraft setzen. Da Methoden keine besonderen Privilegien haben, wenn sie andere Methoden desselben Objekts aufrufen, kann eine Methode einer Basisklasse, die eine andere in derselben Basisklasse definierte Methode aufruft, am Ende tatsächlich eine Methode einer abgeleiteten Klasse aufrufen, die sie außer Kraft setzt. (Für C++-Programmierer: Alle Methoden in Python sind praktisch virtuell.)" Wenn das für Sie keinen Sinn ergibt (mich verwirrt es gewaltig), können Sie es gerne ignorieren. Ich dachte nur, ich würde es weitergeben.

Ich versuche, ein Beispiel für zu finden: eine Methode einer Basisklasse, die eine andere in derselben Basisklasse definierte Methode aufruft, kann in der Tat eine Methode einer abgeleiteten Klasse aufrufen, die diese überschreibt

class A:      
  def foo(self): print 'A.foo'      
  def bar(self): self.foo()                  

class B(A):      
  def foo(self): print 'B.foo'     

if __name__ == '__main__': 
  a = A()                
  a.bar()                   # echoes A.foo
  b = B()
  b.bar()                   # echoes B.foo

... aber beides scheint ziemlich offensichtlich zu sein.

Habe ich etwas übersehen, das in dem Zitat angedeutet wurde?


UPDATE

bearbeiteter Tippfehler von calling a.foo() (anstelle von a.bar() )und b.foo() (anstelle von b.bar() ) im ursprünglichen Code

0 Stimmen

Schmutziger Hack, um an die Eltern heranzukommen b.__class__.__mro__[1].hi(A())

0 Stimmen

@Jakob: warum nicht super ?

0 Stimmen

@Eli Gibt NULL auf python2.6.6 zurück ? :S

9voto

Yakovlev Pavel Punkte 71

Beachten Sie, dass dies für private Methoden in Python 3.6 nicht funktioniert:

class A:      
  def __foo(self): print 'A.foo'      
  def bar(self): self.__foo()                  

class B(A):      
  def __foo(self): print 'B.foo'     

if __name__ == '__main__': 
  a = A()                
  a.bar()                   # echoes A.foo
  b = B()
  b.bar()                   # echoes A.foo, not B.foo

Ich habe eine Stunde damit verbracht, den Grund dafür herauszufinden

8voto

Eli Bendersky Punkte 246100

Ja, das haben Sie übersehen:

b.bar()   # echoes B.foo

B hat keine bar eine eigene Methode, sondern nur diejenige, die von A . A 's bar ruft auf. self.foo sondern in einem Fall von B endet mit einem Anruf B 's foo und nicht A 's foo .

Schauen wir uns Ihr Zitat noch einmal an:

eine Methode einer Basisklasse eine andere Methode, die in der gleichen Basisklasse definiert ist, kann in der Tat dazu führen, dass sie eine Methode einer abgeleiteten Klasse, die außer Kraft setzt

Zu übersetzen:

bar (Methode der A , ruft auf. self.foo sondern kann in f eine Methode der abgeleiteten Klasse aufrufen aufruft, die diese überschreibt ( B.foo die außer Kraft setzt. A.foo )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X