Python:保存动态创建的对象类型

7 投票
7 回答
3271 浏览
提问于 2025-04-16 13:56

我正在使用类型函数动态创建一些对象类型。比如:

return type('DynamicType', (object,), dict)

这个字典是根据用户输入生成的。现在我想保存这个返回的类类型,以便在不同的会话中使用同一个类型。一个可能的方法是把这个字典保存为文本(或者存入数据库),然后再从这个字典中重新创建这个对象类型。但是有没有其他方法可以直接保存这个“类型”呢?

7 个回答

0

在Python中,类也是对象。所以,你可以把类的对象进行“腌制”(也就是序列化),然后保存到一个文件里。之后你可以再把它们“解腌制”(也就是反序列化)回来。

3

你不能直接把类保存起来,即使你解决了“...找不到...”的问题,它还是无法正常工作(比如保存类的名字,但没有内容,然后在程序重启后无法找到这个类)。

你需要手动把字典序列化,然后在之后再从中重建这个类。根据字典里包含的内容,这个过程可能会很麻烦:函数对象是无法被任何方式序列化的,你必须提取它们的代码对象,用marshal来序列化,然后在加载时再重新创建它们。

3

我们可以创建一个工厂类,这个类里面有一些方法,可以用来创建、保存和恢复动态生成的类型对象。下面是一个简单的开始。使用的时候,只需要把原来用pickle.dump(type, fh)的地方换成TypeFactory.pickle(type, fh),把pickle.load(fh)的地方换成TypeFactory.unpickle(fh)就可以了。

import pickle

class TypeFactory(object):
    def __init__(self):
        pass
    @staticmethod
    def create_type(name='DynamicType', dict={}):
        return type(name, (object,), dict)
    @staticmethod
    def pickle(t, fh):
        dict = t.__dict__.copy()
        name = t.__name__
        for key in dict.keys():
            if key.startswith('__') and key.endswith('__'):
                del dict[key]
        pickle.dump((name, dict), fh)
    @classmethod
    def unpickle(cls, fh):
        name, dict = pickle.load(fh)
        return cls.create_type(name, dict)

撰写回答