为动态类型指定元类

Posted

技术标签:

【中文标题】为动态类型指定元类【英文标题】:specify metaclass for dynamic type 【发布时间】:2021-10-25 03:58:55 【问题描述】:

在 Python 中,您可以使用函数 my_type = type(name, bases, dict) 动态创建类型。你将如何为这种类型my_type 指定一个元类? (理想情况下,除了定义一个简单地将元类绑定到实例化子类的一次性 class 对象)

【问题讨论】:

这有点令人困惑,因为type 像这样调用一个元类。如果你有一些其他的元类,它将是type 的子类,可能还有它自己的__new__()。如果你想要一个 that 类型的类,你只需按照你制作这个的方法制作一个:some_meta(name, bases, dict). @Mark 不正确 - 这将跳过正确解析元类基础的步骤。 嗯,我相信你是对的@wim。但是想出一个具体的例子时遇到了麻烦。 @Mark 在PEP 560中给出了一个具体的例子。 实际上只是阅读想法this source 这很清楚。谢谢@wim。 【参考方案1】:

对于Dynamic Type Creation,您需要在类语句中提供关键字(包括但不限于关键字“元类”),您可以使用types.new_class。下面的类定义:

class A(B, C, metaclass=AMeta):
    pass

可以像这样动态创建:

A = types.new_class(
    name="A",
    bases=(B, C),
    kwds="metaclass": AMeta,
    exec_body=None,
)

这比直接调用type 或任何其他元类更可取,因为它解析了元类基 - 取决于BC 的类型,type(A) 这里是might not necessarily be AMeta

【讨论】:

以上是关于为动态类型指定元类的主要内容,如果未能解决你的问题,请参考以下文章

第八章python元类编程

复习打卡--0819元类和内存管理

SQL 通过syscolumns.xtype动态查找指定数据类型字段所包含的数据

菜鸟成长日记:Java基础篇2 --- 动态参数类型

ASP.NET Core中动态为控制器类型添加特性

python——静态语言动态语言强类型语言弱类型语言脚本语言解释型语言编译型语言