跳转到内容

Python 编程/元类

来自维基教科书,开放的书籍,开放的世界


在 Python 中,类本身也是对象。就像其他对象是特定类的实例一样,类本身也是元类的实例。

Pep 3115 定义了 python 3 元类的变化。在 python3 中,您有一个名为 `__prepare__` 的方法,它在元类中被调用以创建字典或其他类来存储类成员。[1] 然后是 `__new__` 方法,它被调用来创建该类的新的实例。[2]

type 元类

[编辑 | 编辑源代码]

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

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

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

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

它可以被实例化以创建新的类对象,类似于上面的类工厂示例,通过传递新类的名称、要继承的基类以及定义要使用的命名空间的字典。

例如,代码

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

也可以写成

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

可以通过在定义类时设置 `metaclass` 关键字参数来创建一个具有不同于 `type` 的元类的类。当这样做时,该类及其子类将使用您的自定义元类创建。例如

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

通过以这种方式创建自定义元类,可以更改类的构造方式。这允许您在创建类时添加或删除属性和方法,注册类的创建和子类的创建,以及各种其他操作。

更多资源

[编辑 | 编辑源代码]

参考资料

[编辑 | 编辑源代码]


Clipboard

待办事项
[不完整] (参见将元类投入使用,伊拉·R·福尔曼,斯科特·H·丹福斯?)


华夏公益教科书