Considere o seguinte código:
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
De Derived.do
, como faço para ligar Base.do
?
Eu normalmente usaria super
ou mesmo o nome da classe base diretamente se este for um método de objeto normal, mas aparentemente não consigo encontrar uma maneira de chamar o método de classe na classe base.
No exemplo acima, Base.do(a)
imprime Base
classe em vez de Derived
classe.
python
class
overriding
class-method
Sridhar Ratnakumar
fonte
fonte
Respostas:
Se você estiver usando uma classe de novo estilo (ou seja, deriva do
object
Python 2 ou sempre do Python 3), você pode fazer isso dasuper()
seguinte maneira:É assim que você chamaria o código na versão do método da classe base (ou seja
print cls, a
), da classe derivada,cls
sendo definido como a classe derivada.fonte
super
métodos de classe.object
. (pelo menos em Python 2, mas em Py3 eu acho que todas as classes são de novo estilo, IIRC) Caso contrário, você terá que fazerBase.do(self, ...)
, eu acho, assim codificando permanentemente o nome da superclasse.Derived.do()
, não écls
o mesmo queDerived
?Derived
mas não de uma subclasse, então sim.já faz um tempo, mas acho que posso ter encontrado uma resposta. Quando você decora um método para se tornar um método de classe, o método original não associado é armazenado em uma propriedade chamada 'im_func':
fonte
__func__
em python 2.7 e 3Isso funciona para mim:
fonte
cls
argumento será então obrigado aBase
vez deDerived