You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python能否从含类定义的字符串生成类?求内存级实现方案

内存级实现从字符串生成Python类的方案

当然可以!完全不需要写入文件再导入,Python内置的exec函数就能帮你实现纯内存级的类生成,直接看具体方案:

核心实现代码

我们可以通过创建独立的命名空间,用exec执行字符串中的类定义,再从命名空间中提取出目标类:

def string_to_class(class_str):
    # 创建空命名空间,隔离执行环境,避免污染全局变量
    namespace = {}
    # 执行字符串中的类定义代码
    exec(class_str, namespace)
    
    # 从命名空间中筛选出类对象(处理单一类的情况)
    class_objects = [obj for name, obj in namespace.items() if isinstance(obj, type)]
    if len(class_objects) == 1:
        return class_objects[0]
    
    # 如果有多个类,抛出明确的错误提示
    raise ValueError("输入字符串包含多个类定义,请指定要获取的类名(可以参考下方的优化版函数)")

测试你的示例代码

把你的测试代码和这个函数结合,运行结果完全符合预期:

class_template = """ class MyClass(object): def __init__(self, name): self.name = name def print_name(self): print('My name is: ' + self.name) def add_whatever(a, b): return a + b """
MyClass = string_to_class(class_template)
my_class_instance = MyClass('Ben')

print(MyClass.add_whatever(2, 3))  # 输出: 5
my_class_instance.print_name()      # 输出: My name is: Ben

优化版:支持指定类名

如果你的输入字符串可能包含多个类定义,可以修改函数,让用户指定要获取的类名,更灵活:

def string_to_class(class_str, class_name=None):
    namespace = {}
    exec(class_str, namespace)
    
    if class_name:
        target_class = namespace.get(class_name)
        if isinstance(target_class, type):
            return target_class
        raise ValueError(f"命名空间中不存在名为{class_name}的类")
    
    # 无类名时,默认返回唯一的类
    class_objects = [obj for name, obj in namespace.items() if isinstance(obj, type)]
    if len(class_objects) == 1:
        return class_objects[0]
    
    raise ValueError("输入字符串包含多个类,请传入class_name参数指定目标类")

重要注意事项

  • 安全风险:exec会执行传入的所有Python代码,如果你的字符串来自不可信的外部输入(比如用户上传的内容),绝对不要使用这种方案,会导致恶意代码注入。
  • 命名空间隔离:我们使用独立的namespace字典,确保执行的代码不会修改全局变量,避免意外的副作用。

内容的提问来源于stack exchange,提问作者Farkas István

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:06:16