python - python:无法使用 eval() 运行对象方法
问题描述
我正在尝试使用eval()
运行动态代码,但它似乎拒绝基于对象的方法:
def GetHelp():
return 'Help'
class MyClass:
def __init__(self):
self.child = 5
def GetChild():
return self.child
x = eval('Get{}()'.format('Help'))
print(x)
obj = MyClass()
y = eval('obj.Get{}()'.format('Child'))
print(y)
上面的代码给了我:
Help
Traceback (most recent call last):
File "/Users/kakyo/Desktop/0.Dev/playground/python/hello_eval.py", line 14, in <module>
y = eval('obj.Get{}()'.format('Child'))
File "<string>", line 1, in <module>
TypeError: GetChild() takes 0 positional arguments but 1 was given
我试图将 obj 添加到locals
:
y = eval('obj.Get{}()'.format('Child'), {'obj': obj})
但得到了同样的错误。
解决方案
该错误与您使用的事实无关eval
(但不要使用eval
)。这是因为GetChild
不接受self
(或实际上任何其他参数)作为其签名中的实例。
它应该是def GetChild(self)
但是(如果还不清楚的话)eval
应该不惜一切代价避免,并且很少是给定问题的唯一解决方案。
在这种情况下,最好使用getattr
:
obj = MyClass()
y = getattr(obj, 'Get{}'.format('Child'))()
print(y)
推荐阅读
- c - 装配如何使用 SIDT 或 LIDT?
- firebase - 将速度转换为 mph(颤振)
- java - 在 Apache Beam 中处理文件时保留文件名
- java - 将 ArrayList 从一个 jsp 传递到另一个 jsp
- directx-11 - 红色点光源未正确投射 [D3D11]
- android - Android 键盘 InputConnection setSelection 不适用于 unicode?
- openapi - OpenAPI 3 规范动态字段值
- html - 如何在 css `content` 属性中/顶部放置链接(不会弄乱属性的显示)?
- python - Python矩阵深度优先搜索
- java - 如何在spring中从json中的对象获取信息