为什么python super()在ABCMETA类中没有参数就无法工作?

问题描述 投票:0回答:1

我在理解python3.6的abc.ABCMeta类中的函数super()行为时遇到问题。

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'>

我觉得这是对象初始化的原因,但是我不能用我目前在OOP和Python OOP中的技能来理解这些信息。

python super metaclass abc six
1个回答
1
投票

0参数super使用实际出现呼叫的类,但是在@six.add_metaclass(ABCMeta)之后,绑定到ChildClass名称的类是装饰器创建的新类。 0参数super仍在使用原始类。

[如果要使用仅适用于Python 3的0参数super,只需使用Python 3元类语法而不是six

© www.soinside.com 2019 - 2024. All rights reserved.