##metaclass是元类## 大部分常见的基础元类都是type。当输入一个参数时,type将简单的返回输入对象的类型,这就不涉及元类。然而当输入三个参数时,type将扮演元类的角色,基于输入参数建立一个类并返回。输入参数至关简单:类名,父类及其参数的字典。后面二者能够为空,来看一个例子:python
<!-- lang: python --> >>> MyClass = type("MyClass", (object,), {"my_attribute": 0}) >>> type(MyClass) <type 'type'> >>> o = MyClass() >>> o.my_attribute 0
特别注意第二个参数是一个tuple(语法看起来很奇怪,以逗号结尾)。若是你须要在类中安排一个方法,那么建立一个函数而且将其以属性的方式传递做为第三个参数,像这样: <!-- lang: python --> >>> def myclass_init(self, my_attr): ... self.my_attribute = my_attr ...
>>> MyClass = type("MyClass", (object,), {"my_attribute": 0, "init": myclass_init}) >>> o = MyClass("Test") >>> o.my_attribute 'Test' >>> o.init <bound method MyClass.myclass_init of <main.MyClass object at 0x10ab72150>> 咱们能够经过一个可调用对象(函数或是类)来自定义元类,这个对象须要三个输入参数并返回一个对象。这样一个元类在一个类上实现只要定义了它的__metaclass__属性。第一个例子,让咱们作一些有趣的事情看看咱们可以用元类作些什么:
<!-- lang: python --> def Hello(name, parents, attributes): print name, parents, attributes return type(name, parents, attributes)函数
class MM(object): __metaclass__ = Hello def __init__(self): print "hello" if __name__ == '__main__': a = MM() print a
调用顺序是:先调用__metaclass__, 而后是__init__。输出结果为:
MM (<type 'object'>,) {'module': 'main', 'metaclass': <function Hello at 0x0249F2F0>, 'init': <function init at 0x0249F4B0>} hello <main.MM object at 0x0249BEB0>code