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

问题描述 投票:0回答:1
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 的实例吗?

python python-3.x oop metaclass
1个回答
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)

至:

new_class = super().__new__(cls, name, bases, dct)

演示:https://ideone.com/KIy2qG

© www.soinside.com 2019 - 2024. All rights reserved.