在阅读文章一些Python的开放源代码项目源代码时 ,会见到一些目标调用了一个方法,但在该目标之中却又找不着该方法 。还很有可能会见到在调用某一方法是并并不是立即调用只是应用了getattr这一方法;好在如今IDE较为智能化,一般也还可以关系找获得该方法;
调用目标自身沒有存有的方法属性、间接性调用方法 ,下边看一下在Python中这是什么原因;
在Python中有许多内嵌函数,上边常说的作用更是根据它的内嵌去看书完成的:应用了那么好多个内嵌函数:setattr 、getattr、hasattr函数;
setattr函数
字面意思,设定属性值 ,它的真正工作也仅仅设定函数值;但它能够给某一目标设定一个他不会有的属性而且取值;
class Ten: def __init__(self, data): print("init") def register(name, fn): setattr(Ten, name, fn)
上边界定了一个类,此类并沒有属性或除开init方法外别的的方法;界定一个register方法,该方法用于向Ten类中注册属性、方法;
t = Ten()
调用register方法 ,注册属性val ,数值5;
register("val", 5) print(t.val)
打印输出注册的属性val值:5;
界定一个新类:Ops
class Ops: @staticmethod def add(x, y): return x y
在Ten类中注册ops属性,数值刚界定的类Ops;
register("ops", Ops) value= t.ops.add(1, 2) print(value)
这时能够根据注册的属性ops调用该属性的方法;
getattr 、hasattr函数
getattr函数用于获得属性、hasattr用于检验某一属性是不是存有;
value = getattr(t, "val") print(value)
获得上边注册的属性val,輸出数值5;
获得不会有的属性会抛出异常 ,这时可应用hasattr函数用于分辨属性是不是存有,再做下一步解决;
hasattr(t,"mul") 回到False hasattr(t,”va ”) 回到True
了解了这好多个函数,见到图上这类编码就可以立懂了。