super () завершается с ошибкой: TypeError "аргумент 1 должен быть типом, а не classobj", когда родитель не наследует от объекта
Я получаю некоторую ошибку, которую я не могу понять. Есть идеи, что не так с моим образцом кода?
class B:
def meth(self, arg):
print arg
class C(B):
def meth(self, arg):
super(C, self).meth(arg)
print C().meth(1)
я получил образец тестового кода с помощью встроенного метода "super". Класс " C " - это
здесь ошибка:
Traceback (most recent call last):
File "./test.py", line 10, in ?
print C().meth(1)
File "./test.py", line 8, in meth
super(C, self).meth(arg)
TypeError: super() argument 1 must be type, not classobj
FYI, вот помощь (супер) от самого python:
Help on class super in module __builtin__:
class super(object)
| super(type) -> unbound super object
| super(type, obj) -> bound super object; requires isinstance(obj, type)
| super(type, type2) -> bound super object; requires issubclass(type2, type)
| Typical use to call a cooperative superclass method:
| class C(B):
| def meth(self, arg):
| super(C, self).meth(arg)
|
4 ответов
ваша проблема в том, что класс B не объявлен как класс "нового стиля". Измените его так:
class B(object):
и оно будет работать.
super()
и все подклассы / суперклассы работают только с классами нового стиля. Я рекомендую вам взять в привычку всегда вводить это (object)
на любом определении класса, чтобы убедиться, что это класс нового стиля.
классы старого стиля (также известные как "классические" классы) всегда имеют тип classobj
; классы нового стиля имеют тип type
. Вот почему вы получили сообщение об ошибке:
TypeError: super() argument 1 must be type, not classobj
попробуйте это, чтобы увидеть для себя:
class OldStyle:
pass
class NewStyle(object):
pass
print type(OldStyle) # prints: <type 'classobj'>
print type(NewStyle) # prints <type 'type'>
обратите внимание, что в Python 3.х, все классы нового стиля. Вы все еще можете использовать синтаксис из классов старого стиля, но получите класс нового стиля. Так, в Python 3.x у вас не будет этой проблемы.
кроме того, если вы не можете изменить класс B, вы можете исправить ошибку, используя множественное наследование.
class B:
def meth(self, arg):
print arg
class C(B, object):
def meth(self, arg):
super(C, self).meth(arg)
print C().meth(1)
Если версия python равна 3.Икс, все в порядке.
Я думаю, что ваша версия python-2.Х, супер будет работать при добавлении этого кода
__metaclass__ = type
код
__metaclass__ = type
class B:
def meth(self, arg):
print arg
class C(B):
def meth(self, arg):
super(C, self).meth(arg)
print C().meth(1)
Я также столкнулся с опубликованной проблемой, когда я использовал python 2.7. Он отлично работает с python 3.4
чтобы он работал в python 2.7, я добавил __metaclass__ = type
атрибут в верхней части моей программы, и это сработало.
__metaclass__
: это облегчает переход от классов старого стиля и классов нового стиля.