Betrachten Sie den folgenden Code:
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 an Base.do
?
Normalerweise würde ich super
oder sogar den Namen der Basisklasse direkt verwenden, wenn dies eine normale Objektmethode ist, aber anscheinend kann ich keine Möglichkeit finden, die Klassenmethode in der Basisklasse aufzurufen.
Im obigen Beispiel wird eine Klasse anstelle einer Klasse Base.do(a)
gedruckt .Base
Derived
python
class
overriding
class-method
Sridhar Ratnakumar
quelle
quelle
Antworten:
Wenn Sie eine Klasse neuen Stils verwenden (dh von
object
Python 2 oder immer von Python 3 abgeleitet), können Sie dies folgendermaßen tunsuper()
:Auf diese Weise würden Sie den Code in der Version der Methode der Basisklasse (dh
print cls, a
) von der abgeleiteten Klasse aufrufen ,cls
indem Sie ihn auf die abgeleitete Klasse setzen.quelle
super
für Klassenmethoden verwenden kann.object
. (Zumindest in Python 2, aber in Py3 denke ich, dass alle Klassen im neuen Stil sind, IIRC) Andernfalls müssen Sie, glaubeBase.do(self, ...)
ich, den Namen der Oberklasse hart codieren.Derived.do()
ist das nichtcls
dasselbe wieDerived
?Derived
einer Unterklasse handelt, aber nicht um eine Unterklasse, dann ja.Das ist eine Weile her, aber ich glaube, ich habe vielleicht eine Antwort gefunden. Wenn Sie eine Methode dekorieren, um eine Klassenmethode zu werden, wird die ursprüngliche ungebundene Methode in einer Eigenschaft namens 'im_func' gespeichert:
quelle
__func__
in Python 2.7 und 3Das funktioniert bei mir:
quelle
cls
Argument wird dann gebunden werdenBase
stattDerived