我们知道 python eval函数可以对参数中的字符串变量去掉双引号, 并进行计算。例如
>>> eval("1+2")
3
>>> eval("[1,2,3]")
[1, 2, 3]
>>> eval("{'key':'value'}")
{'key': 'value'}
上面的例子分别将一个数学表达式字符串, 列表字符串, 字典字符串转换为相应的值。
从对列表字符串和字典字符串的例子来看, eval可以把字符串转为对象。
同样的, eval可以针对自定义的类, 通过类名字符串来进行相应的转换。类似于java中的反射。见下面的例子:
# 定义一个自定义的类
class SimpleDataSet(object):
def __init__(self):
super(SimpleDataSet, self).__init__()
print("Test")
def xx(self):
print("TestXX")
# 定义字符串变量, 变量的值和类名一致
module_name = 'SimpleDataSet'
# 使用eval将字符换换为自定义的类
dataset = eval(module_name)()
# 调用类对象的函数
dataset.xx()
是不是瞬间觉得eval的功能强大? 目前想到在设计模式中也有广泛的应用。