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实例.如果在作为type的子类的父类中重写了__new__,则调用super().__new__而不是type.__new__以允许遵循方法解析顺序.

更改:

new_class = type(name, bases, dct)

致:

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

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

Python相关问答推荐

对Numpy函数进行载体化

try 与gemini-pro进行多轮聊天时出错

如何将双框框列中的成对变成两个新列

. str.替换pandas.series的方法未按预期工作

将数据框架与导入的Excel文件一起使用

运行终端命令时出现问题:pip start anonymous"

更改键盘按钮进入'

无法定位元素错误404

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

当我try 在django中更新模型时,模型表单数据不可见

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

* 动态地 * 修饰Python中的递归函数

Python Pandas—时间序列—时间戳缺失时间精确在00:00

如何将数据帧中的timedelta转换为datetime

Polars Group by描述扩展

不允许 Select 北极滚动?

数据框,如果值在范围内,则获取范围和

Autocad使用pyautocad/comtypes将对象从一个图形复制到另一个图形

当输入是字典时,`pandas. concat`如何工作?

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC