В 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)
, он будет работать. Какое этому объяснение?
Ответы:
Причина в том, что
super()
работает только с классами нового стиля , что в серии 2.x означает расширение отobject
:источник
Кроме того, не используйте super (), если в этом нет необходимости. Вы, возможно, подозреваете, что делать с классами нового стиля - это не универсальный "правильный подход".
Бывают случаи, когда вы ожидаете множественного наследования и, возможно, захотите этого, но пока вы не узнаете сложные детали MRO, лучше не трогать его и придерживаться следующих правил:
источник
__init__
), чтобы передавать аргументы чистым и разумным способом, иначе вы получите TypeErrors или еще хуже проблемы отладки, когда кто-то попытается наследовать умножением с использованием вашего класса. Если вы действительно не разработали для поддержки MI таким образом (что довольно сложно), вероятно, лучше избежать предположенияsuper
, что этот метод является MI-безопасным.Если ни один из приведенных выше ответов не упомянул это четко. Ваш родительский класс должен быть унаследован от «объекта», что по сути превратило бы его в новый класс стиля.
источник
Я пробовал различные методы Xa (); однако им, похоже, требуется экземпляр X для выполнения a (), поэтому я сделал X (). a (self), который кажется более полным, чем предыдущие ответы, по крайней мере, для приложений, с которыми я столкнулся. Это не кажется хорошим способом решения проблемы из-за ненужных построений и разрушений, но работает нормально.
Моим конкретным приложением был модуль Python cmd.Cmd, который по какой-то причине явно не является объектом NewStyle.
Конечный результат:
источник