Python 动态生成的类如何导出到文件中

用 type 生成的类, 要怎么导出到 xxx.py 文件中

cls = type("ClsName", (object, ), attr)
code = xxxGetSource(cls)
writeToFile(code, "moduleName/ClsName.py")

django,makemigrations 的时候,需要把 Model 的继承的父类 注册到 migrations 的文件中, 然后, 我的一些 Model 继承的类是动态生成的 譬如:

class XXXModel(GenerateCls({ .... }),
           models.Model):
pass

def GenerateCls(…): … return type(name, bases, attr)


Python 动态生成的类如何导出到文件中

3 回复

这个问题挺有意思的。Python动态生成的类要导出到文件,核心就是序列化。但普通的pickle对动态类支持不好,特别是当类定义不在模块里的时候。

最直接的方法是用dill库,它是pickle的增强版,能处理动态类、lambda函数这些。看代码:

import dill

# 动态创建一个类
DynamicClass = type('DynamicClass', (), {'x': 42, 'say_hello': lambda self: 'Hello'})

# 保存到文件
with open('dynamic_class.pkl', 'wb') as f:
    dill.dump(DynamicClass, f)

# 从文件加载
with open('dynamic_class.pkl', 'rb') as f:
    LoadedClass = dill.load(f)

# 测试
obj = LoadedClass()
print(obj.x)  # 输出: 42
print(obj.say_hello())  # 输出: Hello

如果你不想用第三方库,也可以把类的定义信息保存为字典,然后重建:

import json

# 动态创建类
DynamicClass = type('DynamicClass', (), {'x': 42, 'y': 100})

# 提取类信息
class_info = {
    'name': DynamicClass.__name__,
    'bases': [base.__name__ for base in DynamicClass.__bases__],
    'dict': {k: v for k, v in DynamicClass.__dict__.items() 
             if not k.startswith('__')}
}

# 保存为JSON
with open('class_info.json', 'w') as f:
    json.dump(class_info, f)

# 从JSON重建
with open('class_info.json', 'r') as f:
    info = json.load(f)
    
# 注意:这个方法只能保存简单的属性和方法
RecreatedClass = type(info['name'], (), info['dict'])

用dill最省事,它能完整保存类的状态。


code = xxxGetSource(cls),在里面遍历属性、通过 inspect.getsource 拿到 function 的源码……其他的就是格式化的问题了

pickle 这个库可以吗?不是很懂。

回到顶部