我想在python用exec动态执行某些语句,动态定义一个类并随后调用这个类,但是出现了问题。
问题的描述
现在有一个需求,就是python中使用字符串动态定义一个类,并随后使用其中的方法。
可以运行的代码
# /test.py
# coding=utf-8
content = '''
class MyClass:
def __init__(self):
self.name = None
self.age = None
def do():
return MyClass()
'''
exec content
print do()
# 或者最后一句话改成exec("print do()")
直接运行这段代码是没有问题的,得到了输出<__main__.MyClass instance at 0x000000000243EB88>
。
不可以运行的代码
首先定义另一个actor.py
文件:
# /actor.py
# coding=utf-8
def execute(content):
exec content
return do()
然后定义test.py
文件:
# /test.py
# coding=utf-8
import actor
content = """
class MyClass:
def __init__(self):
self.name = None
self.age = None
def do():
return MyClass()
"""
print actor.execute(content)
运行test.py
文件,会出现NameError: global name 'MyClass' is not defined
。
我的需求就是,定义一个模块,在这个模块的函数中执行一段指定的字符串,动态定义一个类,并且需要调用这个类,现在遇到的问题如上所示,求助啊。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先“exec”是不被推荐的方法,因为它会带来一些问题:
一些基于__module__属性的模块会失败,比如pickle,inspect,pydoc等
内存泄漏
namespace和module shutdown behavior issue
关于这几点问题的详细描述,可以参考:http://lucumr.pocoo.org/2011/...
既然你硬要这么做的话,下面代码可以提供一点参考:
tester.py
actor.py
动态创建一个类
你会考虑用exec, 可能是没接触到python的高级特性