跳到内容

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

待办事项
[不完整] (参见 Putting Metaclasses to Work, Ira R. Forman, Scott H. Danforth?)


华夏公益教科书