У меня проблема с пониманием поведения функции super () в классе abc.ABCMeta в python3.6.

class ParentClass():
    def test():
        return 1
​
@six.add_metaclass(ABCMeta)
class ChildClass(ParentClass):
    def test(self):
        test_ = super().test
        test_ = 2
        return test_
​
a = ChildClass()
​
a.test()

Код не выполнен с 'TypeError: super(type, obj): obj must be an instance or subtype of type'.

Когда я использовал super(ChildClass, self).test, он работал правильно! Печать из тестовой функции ChildClass:

print(__class__)

print(type(__class__))

print(ChildClass)

print(type(ChildClass))

Я получаю следующий результат:

<class '__main__.ChildClass'>

<class 'type'>

<class '__main__.ChildClass'>

<class 'abc.ABCMeta'>

Я чувствую, что причина в инициализации объекта, но я не могу понять эту информацию с моими текущими навыками в ООП и ООП Python.

-1
Dmitry Kurgansky 20 Окт 2019 в 20:37

1 ответ

Лучший ответ

0-аргумент super использует класс, в котором фактически появился вызов, но после @six.add_metaclass(ABCMeta) класс, связанный с именем ChildClass, является новым классом, созданным декоратором. 0-аргумент super все еще использует исходный класс.

Если вы собираетесь использовать 0-аргумент super, который работает только на Python 3, просто используйте синтаксис метакласса Python 3 вместо six.

3
user2357112 supports Monica 20 Окт 2019 в 17:40