元类简介
什么是元类?
在 Python 中,一切都是对象:整数,字符串,列表,甚至函数和类本身都是对象。每个对象都是一个类的实例。
要检查对象 x 的类,可以调用 type(x)
,所以:
>>> type(5)
<type 'int'>
>>> type(str)
<type 'type'>
>>> type([1, 2, 3])
<type 'list'>
>>> class C(object):
... pass
...
>>> type(C)
<type 'type'>
python 中的大多数类都是 type
的实例。type
本身也是一个类。其实例也是类的类称为元类。
最简单的元类
好的,所以 Python 中已经有一个元类:type
。我们可以创造另一个吗?
class SimplestMetaclass(type):
pass
class MyClass(object):
__metaclass__ = SimplestMetaclass
这不会添加任何功能,但它是一个新的元类,请看 MyClass 现在是 SimplestMetaclass 的一个实例:
>>> type(MyClass)
<class '__main__.SimplestMetaclass'>
做某事的元类
在调用创建类的原始 __new__
之前,执行某些操作的元类通常会覆盖 type
的 __new__
,以修改要创建的类的某些属性:
class AnotherMetaclass(type):
def __new__(cls, name, parents, dct):
# cls is this class
# name is the name of the class to be created
# parents is the list of the class's parent classes
# dct is the list of class's attributes (methods, static variables)
# here all of the attributes can be modified before creating the class, e.g.
dct['x'] = 8 # now the class will have a static variable x = 8
# return value is the new class. super will take care of that
return super(AnotherMetaclass, cls).__new__(cls, name, parents, dct)