基本元类

当使用三个参数调用 type 时,它表现为(meta)类,并创建一个新实例,即。它产生一个新的类/类型。

Dummy = type('OtherDummy', (), dict(x=1))
Dummy.__class__              # <type 'type'> 
Dummy().__class__.__class__  # <type 'type'> 

可以将 type 子类化以创建自定义元类。

class mytype(type):
    def __init__(cls, name, bases, dict):
        # call the base initializer
        type.__init__(cls, name, bases, dict)

        # perform custom initialization...
        cls.__custom_attribute__ = 2

现在,我们有一个新的自定义 mytype 元类,可用于以与 type 相同的方式创建类。

MyDummy = mytype('MyDummy', (), dict(x=2))
MyDummy.__class__              # <class '__main__.mytype'>
MyDummy().__class__.__class__  # <class '__main__.mytype'>
MyDummy.__custom_attribute__   # 2

当我们使用 class 关键字创建一个新类时,默认情况下会根据基类选择元类。

>>> class Foo(object):
...     pass

>>> type(Foo)
type

在上面的例子中,唯一的基类是 object,所以我们的元类将是 object 的类型,即 type。可以覆盖默认值,但这取决于我们是使用 Python 2 还是 Python 3:

Python 2.x <= 2.7

特殊的类级属性 __metaclass__ 可用于指定元类。

class MyDummy(object):
    __metaclass__ = mytype
type(MyDummy)  # <class '__main__.mytype'>

Python 3.x >= 3.0

特殊的 metaclass 关键字参数指定元类。

class MyDummy(metaclass=mytype):
    pass
type(MyDummy)  # <class '__main__.mytype'>

类声明中的任何关键字参数(metaclass 除外)都将传递给元类。因此 class MyDummy(metaclass=mytype, x=2) 会将 x=2 作为关键字参数传递给 mytype 构造函数。

阅读 python 元类的这个深入描述以获取更多详细信息。