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

来源:互联网 发布:java web开发教程 编辑:程序博客网 时间:2024/05/03 13:53

我曾经看过一段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")得以执行。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头盔玻璃罩边固定老是掉怎么办 电动车不戴头盔被扣车怎么办 郴州骑电动车没戴头盔怎么办 配置数据源时发现两个版本怎么办 微信占用内存3g怎么办 打印机显示内存已满怎么办 网页显示代理服务器连接失败怎么办 墙内线路断了怎么办 墙里的电线坏了怎么办 鱼竿最前端断了怎么办 下雨天墙壁与管道间漏水怎么办 电饭锅的电线被雨淋了怎么办 钢琴跨八度手短怎么办 弹钢琴手指不灵活怎么办呢? 理发剪不锋利了怎么办 室外宽带线断了怎么办 接宽带光纤太短怎么办 装修光纤网线太短怎么办 宽带入户线断了怎么办 电信有无线没网怎么办 墙里的网线断了怎么办 墙里网线断了怎么办 3根网线断了怎么办 剪了层次的头发怎么办 小米6充电线坏了怎么办 小米6导航信号弱怎么办 麦多多充不了电怎么办 一加数据线坏了怎么办 小米耳机泡水了怎么办 公司拖欠工资公司破产了怎么办 苹果x外壳掉漆怎么办 手机壳按键很硬怎么办 棉质白衣服染色怎么办 白棉t恤混洗染色怎么办 包包被衣服染色了怎么办 白色衣服染了菜汁怎么办 一加3t屏幕刺眼怎么办 怀孕吃了好多杏怎么办 门破了个洞怎么办 钢圈轮毂刮花了怎么办 瓷砖用刀子划了怎么办