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'>
为什么打印的是
<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)
至:
new_class = super().__new__(cls, name, bases, dct)