我在理解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中的技能来理解这些信息。
0参数super
使用实际出现呼叫的类,但是在@six.add_metaclass(ABCMeta)
之后,绑定到ChildClass
名称的类是装饰器创建的新类。 0参数super
仍在使用原始类。
[如果要使用仅适用于Python 3的0参数super
,只需使用Python 3元类语法而不是six
。