Python/元类
< 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
使用定制元类,在创建类时可以增加或删除属性与方法,注册一个类或其子类的创建。