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 这个库可以吗?不是很懂。

