如何将字符串形式的Python类编译为可调用对象并调用其方法
动态编译执行字符串形式的Python类
没问题,我来帮你搞定这个需求!你的思路方向是对的,但compile()的用法需要稍微调整下——它返回的是代码对象,得先执行它才能拿到类。另外注意你给的原始代码里的print是Python 2的语法,要是在Python 3环境里得改成带括号的函数形式。
下面是完整的可运行代码:
cstr = """ class A: def show(self, msg): print("msg:", msg) # 适配Python3的print写法,Python2环境可以去掉括号 """ # 第一步:把字符串编译成代码对象 code_obj = compile(cstr, "<string>", "exec") # 第二步:创建一个命名空间来执行代码,这样能拿到定义的类 namespace = {} exec(code_obj, namespace) # 第三步:从命名空间里取出类 Clazz = namespace["A"] # 实例化并调用show方法 instance = Clazz() instance.show("hello")
进阶技巧:不依赖类名A
如果你真的不想管类名是什么,只要确保类里有可调用的show()方法,也可以遍历命名空间自动匹配:
Clazz = None for name, obj in namespace.items(): # 判断是否是类,且包含可调用的show方法 if isinstance(obj, type) and hasattr(obj, "show") and callable(getattr(obj, "show")): Clazz = obj break if Clazz: instance = Clazz() instance.show("hello") else: print("没找到符合要求的类")
关键点说明
compile()的第三个参数"exec"必须添加,因为我们要执行的是类定义这种多行代码块,不是单个表达式。- 用自定义命名空间
namespace承接执行后的内容,才能从里面提取出我们动态定义的类。 - 动态执行字符串代码要小心安全风险,别随便运行不可信的代码哦!
内容的提问来源于stack exchange,提问作者Buzz Moschetti
相关产品推荐
相关产品推荐

