为动态类型指定元类
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
或任何其他元类更可取,因为它解析了元类基 - 取决于B
和C
的类型,type(A)
这里是might not necessarily be AMeta
。
【讨论】:
以上是关于为动态类型指定元类的主要内容,如果未能解决你的问题,请参考以下文章