Python/元类

维基教科书,自由的教学读本

在Python语言中,类(class)也是对象,即是特定类的实例。这里的特定类就是元类(metaclass)。

Python3[编辑]

Python3的元类的新变化,见Pep 3115

元类的方法__prepare__可以被调用,以创建一个词典或其它类,以存储元类实例(即普通类)的类成员。[1]

元类的方法__new__可以被调用,以创建类的新实例。[2]

type作为元类[编辑]

Python的所有标准类型是"type"类的实例。即标准类型的元类是"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

使用定制元类,在创建类时可以增加或删除属性与方法,注册一个类或其子类的创建。

更多资源[编辑]

参考文献[编辑]