在 Python 中,本身也是对象。就像其他对象是某个特定的实例一样,本身是元(metaclass)的实例。

Python3

PEP 3115 定义了 Python 3 元的变化。在 Python 3 中,元会调用 __prepare__ 方法来创建一个字典或其他来存储成员[1]。接着调用 __new__ 方法来创建该的新实例[2]。

type

所有标准 Python 型的元"type" 对象。

>>> type(object)
<type 'type'>
>>> type(int)
<type 'type'>
>>> type(list)
<type 'type'>

就像 listintobject 一样,type 本身也是一个普通的 Python 对象,并且它本身是一个的实例。在这种情况下,type 实际上是它自己的实例。

>>> type(type)
<type 'type'>

它可以像工厂示例中一样被实例化,通过传递新的名称、继承的基和定义命名空间的字典来创建新的对象。

例如,以下代码:

>>> class MyClass(BaseClass):
...     attribute = 42

也可以写成:

>>> MyClass = type("MyClass", (BaseClass,), {'attribute' : 42})

可以通过在定义时设置 metaclass 关键字参数来创建具有不同元。当这样做时,及其子将使用自定义元来创建。例如:

class CustomMetaclass(type):
    def __init__(cls, name, bases, dct):
        print("Creating class %s using CustomMetaclass" % name)
        super(CustomMetaclass, cls).__init__(name, bases, dct)

class BaseClass(metaclass=CustomMetaclass):
    pass

class Subclass1(BaseClass):
    pass

这将输出:

Creating class BaseClass using CustomMetaclass
Creating class Subclass1 using CustomMetaclass

通过以这种方式创建自定义元,可以改变的构建方式。这使得你可以在创建时添加或删除属性和方法,注册和子的创建以及执行各种其他操作。

Last modified: Friday, 31 January 2025, 1:08 AM