2009-08-12 19 views
74

den folgenden Code vor:Aufruf einer Class der Basisklasse in Python

class Base(object): 

    @classmethod 
    def do(cls, a): 
     print cls, a 

class Derived(Base): 

    @classmethod 
    def do(cls, a): 
     print 'In derived!' 
     # Base.do(cls, a) -- can't pass `cls` 
     Base.do(a) 

if __name__ == '__main__': 
    d = Derived() 
    d.do('hello') 

> $ python play.py 
> In derived! 
> <class '__main__.Base'> msg 

Von Derived.do, wie rufe ich Base.do?

Normalerweise würde ich super oder sogar den Basisklassennamen direkt verwenden, wenn dies eine normale Objektmethode ist, aber anscheinend kann ich keinen Weg finden, die Klassenmethode in der Basisklasse aufzurufen.

Im obigen Beispiel druckt Base.do(a)Base Klasse statt Derived Klasse.

+0

Verwandte: [Wie eine Elternklasse Methode von Kind-Klasse in Python nennen?] (Http://stackoverflow.com/q/805066/95735) –

Antwort

83
super(Derived, cls).do(a) 

EDIT: Oh, warten Sie eine Minute ... es ist nicht klar, genau das, was Sie fragen. Auf diese Weise würden Sie den Code in der Basisklassenversion der Methode von der abgeleiteten Klasse aufrufen.

+5

uh äh .. wie kommt es mir nie vor, dass ich 'super' auch auf Klassenmethoden verwenden kann. –

+0

dies funktioniert nur (aufgrund einer Beschränkung durch Super), wenn die Basis von Objekt abgeleitet ist, oder? Was machst du, wenn das nicht der Fall ist? –

+0

Ja, das funktioniert nur für New-Style-Klassen, die von 'Objekt' abgeleitet sind. (zumindest in Python 2, aber in Py3 finde ich alle Klassen neuartig, IIRC) Ansonsten muss man 'Base.do (self, ...)' machen, denke ich, dabei den Namen des Oberklasse. –

-2

Dies funktioniert für mich:

Base.do('hi') 
+7

Das 'cls' Argument wird dann an' Base' anstatt an 'Derived' gebunden. –

+0

was für mich funktioniert ist das - was (sehr) aussieht wie Neds Antwort: wobei sich self von QGraphicsView ableitet welches paintEvent (QPaintEvent) hat def paintEventO (self, qpntEvent): Druck dir (Selbst-) QGraphicsView.paintEvent (self, qpntEvent) – user192127

10

dies eine Weile gewesen ist, aber ich denke, ich kann eine Antwort gefunden haben. Wenn Sie eine Methode dekorieren ein Class werden die ursprüngliche ungebundene Methode in einer Eigenschaft gespeichert wird, den Namen ‚im_func‘:

class Base(object): 
    @classmethod 
    def do(cls, a): 
     print cls, a 

class Derived(Base): 

    @classmethod 
    def do(cls, a): 
     print 'In derived!' 
     # Base.do(cls, a) -- can't pass `cls` 
     Base.do.im_func(cls, a) 

if __name__ == '__main__': 
    d = Derived() 
    d.do('hello') 
+1

Hinweis: Dieser Ansatz funktioniert für alten Stil Klassen, in denen super() nicht –

+1

auch als '__func__' funktioniert in Python 2.7 und 3 – dtheodor

Verwandte Themen