Почему python super () не работает без параметров в классе ABCMETA? - PullRequest
0 голосов
/ 20 октября 2019

У меня проблема с пониманием поведения функции 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 Ответ

2 голосов
/ 20 октября 2019

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

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

...