python通过实例方法名字的字符串调用方法 目录
方式1 - 反射
hasattr 方法
判断当前实例中是否有着字符串能映射到的属性或者方法, 一般会在 getattr 之前作为判断防止报错
getattr 方法
示例
class A(object): def run(self): return "run" a = A() print hasattr(a, "run") # True print getattr(a, "run") # <bound method A.run of <__main__.A object at 0x0000000002A57160>> print getattr(a, "run")() # run
方式2 - operator 模块
methodcaller 方法
参数
传入两个参数, 分别为字符串表示映射的方法, 另一个参数为此方法的运行参数,
返回值
返回一个 字符串映射到的方法实例
示例
import operator class A(object): def run(self): return "run" def eat(self, s): return s + ": eat" a = A() print operator.methodcaller("run") # <operator.methodcaller object at 0x0000000002ADAC08> print operator.methodcaller("run")(a) # run print operator.methodcaller("eat", "yangtuo")(a) # yangtuo: eat
方式3 - eval 模块
eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。
假设用户恶意输入。比如:
eval("__import__('os').system('ls /Users/chunming.liu/Downloads/')")
那么eval()之后,你会发现,当前文件夹文件都会展如今用户前面。这句其实相当于执行了
os.system('ls /Users/chunming.liu/Downloads/')
不建议使用,因此此处不做示例