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)的第一个参数了。请看下面的方法:
... 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")得以执行。
- python: 为什么元类里面会有函数调用类
- vc里面调用中断为什么会出错??
- 为什么会有字符串函数?
- 为什么会有函数模版
- 析构函数为什么会自动再调用父类的析构函数?
- 07 为什么会有多态?为什么会有抽象类?
- 为什么会两次调用析构函数
- 为什么在实例化子类的对象的时候会调用先调用父类的构造函数
- 为什么构造器里面可以调用本类方法
- 什么是元数据?为什么元数据会有泄漏隐私的风险?
- python调用C语言里面的函数
- 先调用函数才能调用里面的类
- 为什么会有serialVersionUID
- 为什么会有“剩男剩女”
- 为什么会有句柄
- 为什么会有hibernate
- 为什么会有servlet?
- 为什么会有异常
- 智能指针 scoped_ptr
- TCP/IP通信程序设计的丰富多样性
- 301 & 302
- linux shell正则表达式差异比较
- flash actionscript3.0 元件跟随鼠标
- python: 为什么元类里面会有函数调用类
- 内存泄露的快速查找法
- flash web 调试工具 FlashFirebug
- Javascript数据库:Taffy DB
- web service axis2
- iphone 如何添加本地通知(local notification)
- iPhone的OpenGL ES的资源- 18,你必须知道 !
- 基础的重要性(程序员之路)
- Java NIO 在并发型服务器设计中的应用