Python:序列化类层次结构

Python:序列化类层次结构,python,class,serialization,hierarchy,Python,Class,Serialization,Hierarchy,我必须序列化一个动态创建的类层次结构。和一堆对象——后一类的实例 Pythonpickle没有什么大帮助,它的维基上说“类……不能被pickle”。哦,也许有什么把戏我想不出来 性能要求: 反序列化应该非常快,因为序列化的人员为缓存服务,应该可以节省创建相同类层次结构的工作 详情: 类是使用类型(有时是元类)动态创建的 如果您提供定制,我相信您仍然可以使用酸洗 通常,在酸洗时,会存储类导入路径以及实例状态。取消勾选时,将导入该类,并使用存储状态创建一个新实例。这就是为什么pickle不能处理动态

我必须序列化一个动态创建的类层次结构。和一堆对象——后一类的实例

Pythonpickle没有什么大帮助,它的维基上说“类……不能被pickle”。哦,也许有什么把戏我想不出来

性能要求:

反序列化应该非常快,因为序列化的人员为缓存服务,应该可以节省创建相同类层次结构的工作

详情:

类是使用类型(有时是元类)动态创建的

如果您提供定制,我相信您仍然可以使用酸洗

通常,在酸洗时,会存储类导入路径以及实例状态。取消勾选时,将导入该类,并使用存储状态创建一个新实例。这就是为什么pickle不能处理动态类,因为没有什么可导入的

对象。\uuuu reduce\uuuu()
方法允许您存储不同的实例工厂。存储此函数返回的可调用项(同样通过导入路径),并使用指定参数调用以生成实例。然后使用此实例将状态应用于,与常规实例取消勾选的方式相同:

def class_factory(name):
    return globals()[name]()

class SomeDynamicClass(object):
    def __reduce__(self):
        return (class_factory, (type(self).__name__,), self.__dict__)
此处
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
返回函数、函数参数和实例状态


然后,您需要做的就是为工厂函数提供正确的参数来重新创建该类,并返回该类的实例。将使用它,而不是直接导入类。

类是普通的python对象,因此,理论上,如果您为它们提供
\uuuuuuu reduce\uuuuu
(或实现其他pickle协议方法),它们应该是可拾取的。尝试在他们的元类上定义
\uuuuu reduce\uuuu

你有类的实例,你可以对它们进行pickle处理。pickle希望从源代码加载的是类本身。如果生成类本身的方式使它们无法从导入中加载,则不能使用pickle。如果可以从模块导入classname执行
,则即使是动态创建的类也可以进行pickle。@Martijn Pieters不,我没有包含类的模块,我动态生成它们、它们的名称、属性,如果您动态创建了类,那么您需要设计一种方法来从序列化信息重新创建这些类,然后反序列化实例。那将是一个完全定制的工作,一个可能由客户来处理的工作;它为您提供了很多处理取消勾选的灵活性;e、 g.不再要求可以导入类本身。