在阅读有些Python的开源项目源码时,会看到某些对象调用了一个方法,但在该对象当中却又找不到该方法。还可能会看到在调用某个方法是并非直接调用而是使用了getattr这个方法;好在如今IDE比较智能,一般也还可以关联找获得该方法;
调用对象自己没有存在的方法属性、间接调用方法,下面看看在Python中这是怎么回事;
在Python中有很多内置函数,上面所说的功能正是经过它的内置看书实现的:使用了这么几个内置函数:setattr、getattr、hasattr函数;函数
字面意思,设置属性值,它的真实做业也只是设置函数值;但它能够给某个对象设置一个他不存在的属性而且赋值;code
class Ten: def __init__(self, data): print("init") def register(name, fn): setattr(Ten, name, fn)
上面定义了一个类,该类并无属性或除了init方法外其余的方法;定义一个register方法,该方法用于向Ten类中注册属性、方法;对象
t = Ten()
调用register方法,注册属性val,值为5;blog
register("val", 5) print(t.val)
打印输出注册的属性val值:5;get
定义一个新类:Ops源码
class Ops: @staticmethod def add(x, y): return x + y
在Ten类中注册ops属性,值为刚定义的类Ops;it
register("ops", Ops) value= t.ops.add(1, 2) print(value)
此时能够经过注册的属性ops调用该属性的方法;class
getattr函数用于获取属性、hasattr用于检测某个属性是否存在;方法
value = getattr(t, "val") print(value)
获取上面注册的属性val,输出值为5;
获取不存在的属性会抛出异常,此时可以使用hasattr函数用于判断属性是否存在,再作下一步处理;im
hasattr(t,"mul") 返回False hasattr(t,”va”) 返回True
了解了这几个函数,看到图中这种代码就能够秒懂了。