No Python 2.5, o código a seguir gera um TypeError
:
>>> class X:
def a(self):
print "a"
>>> class Y(X):
def a(self):
super(Y,self).a()
print "b"
>>> c = Y()
>>> c.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj
Se eu substituir o class X
por class X(object)
, funcionará. Qual é a explicação para isso?
Respostas:
A razão é que
super()
só opera em classes de novo estilo , o que na série 2.x significa estender deobject
:fonte
Além disso, não use super () a menos que seja necessário. Não é a "coisa certa" de propósito geral que você pode suspeitar fazer com classes de novo estilo.
Há momentos em que você está esperando herança múltipla e pode até querer, mas até que você saiba os detalhes complicados do MRO, é melhor deixá-lo como está e manter:
fonte
__init__
) para passar por argumentos de uma maneira limpa e sensata, caso contrário, você obterá TypeErrors ou problemas de depuração piores quando alguém tentar multiplicar-herdar usando sua classe. A menos que você realmente tenha projetado o suporte para MI dessa maneira (o que é bastante complicado), é provavelmente melhor evitar a implicação desuper
que o método é seguro para MI.No caso de nenhuma das respostas acima mencioná-lo claramente. Sua classe pai precisa herdar de "objeto", o que essencialmente a transformaria em uma nova classe de estilo.
fonte
Tentei os vários métodos Xa (); no entanto, eles parecem exigir uma instância de X para executar a (), então fiz X (). a (self), que parece mais completo do que as respostas anteriores, pelo menos para os aplicativos que encontrei. Não parece ser uma boa maneira de lidar com o problema, pois há construção e destruição desnecessárias, mas funciona bem.
Meu aplicativo específico era o módulo cmd.Cmd do Python, que evidentemente não é um objeto NewStyle por algum motivo.
Resultado final:
fonte