Python super () вызывает TypeError
в Python 2.5, следующий код вызывает 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
если я заменить class X
С class X(object)
, он будет работать. Как это можно объяснить?
4 ответа:
причина в том, что
super()
работает только на новый-стиль-классы, который в 2.серия x означает расширение отobject
:>>> class X(object): def a(self): print 'a' >>> class Y(X): def a(self): super(Y, self).a() print 'b' >>> c = Y() >>> c.a() a b
кроме того, не используйте super (), если вам не нужно. Это не универсальная "правильная вещь", связанная с классами нового стиля, которые вы можете подозревать.
бывают случаи, когда вы ожидаете множественного наследования, и вы, возможно, захотите его, но пока вы не узнаете волосатые детали MRO, лучше оставьте его в покое и придерживайтесь:
X.a(self)
в случае, если ни один из приведенных выше ответов не упомянул об этом ясно. Ваш родительский класс должен наследовать от" объекта", что по существу превратит его в новый класс стиля.
# python 3.x: class ClassName(object): # This is a new style class pass class ClassName: # This is also a new style class ( implicit inheritance from object ) pass # Python 2.x: class ClassName(object): # This is a new style class pass class ClassName: # This is a old style class pass
Я пробовал различные методы X. A (); однако они, похоже, требуют экземпляра X для выполнения a (), поэтому я сделал X ().a (self), который кажется более полным, чем предыдущие ответы, по крайней мере, для приложений, с которыми я столкнулся. Это не кажется хорошим способом решения проблемы, поскольку есть ненужное строительство и разрушение, но он отлично работает.
мое конкретное приложение было cmd Python.Модуль Cmd, который, очевидно, не является объектом NewStyle для некоторых причина.
Окончательный Результат:
X().a(self)