基本元类
当使用三个参数调用 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 元类的这个深入描述以获取更多详细信息。