python: 为什么元类里面会有函数调用类

我曾经看过一段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)的第一个参数了。请看下面的方法:

>>> class test1(test):
...     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")得以执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值