我曾经看过一段python 代码。就是元类里面的函数返回了一个类。我百思不得其解。为什么要这么做呢?通过调试我终于明白为什么这么做了。
>>> class test(type):
... pass
...
>>> class test1(test):
... def fun (cls, count):
... print count
...
>>> class test2(object):
... __metaclass__ = test1
...
>>> t = test2()
>>> t.fun("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'test2' object has no attribute 'fun'
我们看,test2的实例化t不能继承 元类的属性。test2是test1的实例,不是继承的关系。如果是继承的关系,那么t可以用test1中的方法fun()。这里因为fun的参数是cls,也就是t本身是个类的时候才能将自己做为第一个参数传给函数fun(cls,count),那如果想用fun()怎么办呢?这就需要在元类里面增加一个函数,这个函数在test2()实例化的时候就返回一个类。这样实例化的t就是个类,那就可以以类的 方式作为fun(cls,count)的第一个参数了。请看下面的方法:
... def fun (cls, count):
... print count
... def __call__(cls):
... class C(cls):
... print "I am in class C"
... return C
...
>>> class test2(object):
... __metaclass__ = test1
...
>>> t = test2()
I am in class C
>>> t.fun("hello")
hello
这里增加了一个函数__call__(),因为这个保证了test2被实例化的时候,就返回一个类。这里一开始调用 __call__()的时候,类C的参数是cls = test1, 所以C继承了test1的所有的方法。t相当于指向了类C,C指向了test1。所以t.fun("hello")得以执行。