【发布时间】:2021-10-22 23:13:16
【问题描述】:
我定义了一个元类,它将一个名为“test”的方法添加到创建的类中:
class FooMeta(type):
def __new__(mcls, name, bases, attrs):
def test(self):
return super().test()
attrs["test"] = test
cls = type.__new__(mcls, name, bases, attrs)
return cls
然后我使用这个元类创建两个类
class A(metaclass=FooMeta):
pass
class B(A):
pass
当我跑步时
a = A()
a.test()
在super().test() 处引发 TypeError:
super(type, obj): obj must be an instance or subtype of type
这意味着super() 无法正确推断父类。如果我将super 调用更改为
def __new__(mcls, name, bases, attrs):
def test(self):
return super(cls, self).test()
attrs["test"] = test
cls = type.__new__(mcls, name, bases, attrs)
return cls
然后引发的错误变为:
AttributeError: 'super' object has no attribute 'test'
预期作为A 的父级没有实现test 方法。
所以我的问题是在动态添加的方法中调用super() 的正确方法是什么?在这种情况下我应该总是写super(cls, self)吗?如果是这样,那就太丑了(对于python3)!
【问题讨论】:
标签: python oop super metaclass