mik*_*nio 3 python oop metaclass python-3.x
class Meta(type):
def __new__(cls, name, bases, dct):
new_class = type(name, bases, dct)
new_class.attr = 100 # add some to class
return new_class
class WithAttr(metaclass=Meta):
pass
print(type(WithAttr))
# <class 'type'>
Run Code Online (Sandbox Code Playgroud)
为什么它打印<class 'type'>,但不<class '__main__.Meta'>
打印我对吗,类 WithAttr 是 Meta 的实例?
这是因为您正在显式调用type(name, bases, dct),而该调用又调用type.__new__(type, name, bases, dct),并将type类作为第一个参数传递给该type.__new__方法,从而有效地构造了 的实例,type而不是Meta。
您可以改为调用type.__new__(cls, name, bases, dct),将子类作为参数传递以构造Meta实例。如果__new__在作为 的子类的父类中被重写type,请调用super().__new__而不是type.__new__允许遵循方法解析顺序。
改变:
new_class = type(name, bases, dct)
Run Code Online (Sandbox Code Playgroud)
到:
new_class = super().__new__(cls, name, bases, dct)
Run Code Online (Sandbox Code Playgroud)
演示: https: //ideone.com/KIy2qG
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |