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 102

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)