最近做的一个软件用到了python的新浪api,在它的源码中发现了一个很神奇的地方:在类的实例中可以动态调用之前未定义的函数。
先看一段代码:
#-*- coding:utf8 -*-
#定义一个测试类
class MyClass:
#重点在这里!
def __getattr__(self, attr): #读取类属性时候实际上就是调用这个函数
#定义dict()形式传参的函数
def wrap(**kw):
print kw
#这里返回的是函数!!!!
return wrap
#实例化MyClass类
c = MyClass()
#调用之前并未定义的Test方法
c.Test(p = "Hello World!!")
原理:
在执行c.Test(...)时,其实python内部调用的是__getattr__(self, attr),参数attr为调用的函数名称
注意:
在以上述方法重载了类的__getattr__方法后,调用未定义的属性就不会报错了,打印未定义的属性,得到以下结果:
print c.TestAttrib
小结:
python之所以有这种神奇的功能,跟它的内部机制是分不开的。在写COM组件、IDL时操作类属性一样的原理,也是调用的类的get*()和set*()方法.