супер () перестал работать с ошибкой: TypeError “аргумент 1 должен быть типом, не classobj”, когда родитель не наследовался объекту

Решение просто. Это на самом деле , хорошо зарегистрировал , но не слишком легкий для нахождения. (Я должен был вырыть вокруг - это не подходило, когда я попробовал несколько различных поисков Google.)

следующие работы кода:

>>> from django.template import Template, Context
>>> from django.conf import settings
>>> settings.configure()
>>> t = Template('My name is {{ my_name }}.')
>>> c = Context({'my_name': 'Daryl Spitzer'})
>>> t.render(c)
u'My name is Daryl Spitzer.'

Видят документацию Django (связанный выше) для описания некоторых настроек, которые можно хотеть определить (как аргументы ключевого слова для конфигурирования).

185
задан smci 27 May 2018 в 00:10
поделиться

1 ответ

Ваша проблема в том, что класс B не объявлен как класс «нового стиля». Измените его так:

class B(object):

, и он будет работать.

super () и все подклассы / суперклассы работают только с классами нового стиля. Я рекомендую вам выработать привычку всегда вводить этот (object) в любом определении класса, чтобы убедиться, что это класс нового стиля.

Классы старого стиля (также известные как «классические» классы ) всегда имеют тип classobj ; классы нового стиля имеют тип тип . Вот почему вы получили сообщение об ошибке, которое вы видели:

TypeError: аргумент super () 1 должен быть типом, а не classobj

Попробуйте сами убедиться в этом:

class OldStyle:
    pass

class NewStyle(object):
    pass

print type(OldStyle)  # prints: <type 'classobj'>

print type(NewStyle) # prints <type 'type'>

Обратите внимание, что в Python 3.x все классы нового стиля. Вы по-прежнему можете использовать синтаксис из классов старого стиля, но вы получите класс нового стиля. Итак, в Python 3.

308
ответ дан 23 November 2019 в 05:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: