元类简介

什么是元类?

在 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)