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/')

不建议使用,因此此处不做示例

 

posted @ 2021-01-19 15:24  醒日是归时  阅读(292)  评论(0编辑  收藏  举报