类/类的类型,使用元类创建

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 的实例?

blh*_*ing 5

这是因为您正在显式调用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