【问题标题】:Python : serialise class hierarchyPython:序列化类层次结构
【发布时间】:2013-11-21 11:07:38
【问题描述】:

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

Python pickle 没有太大帮助,它的 wiki 说“类......不能被腌制”。 O 可能有一些我想不出来的技巧。

性能要求:

反序列化应该很快,因为序列化的人员用于缓存,应该可以节省我创建相同类层次结构的工作。

详情:

类是使用类型动态创建的,有时使用元类。

【问题讨论】:

  • 你有类的实例,你可以腌制那些就好了
  • 是类本身,Pickle 期望从源代码加载。如果您生成类本身的方式使它们无法从导入中加载,那么您不能使用 pickle。
  • 如果你能做到from module import classname,即使是动态创建的类也可以腌制。
  • @Martijn Pieters 不,我没有包含类的模块,我动态构建它们,它们的名称,属性,一切
  • 如果您动态创建类,那么您需要设计一种方法来从序列化信息中重新创建这些类,然后反序列化实例。这将是一项完全自定义的工作,也许可以由object.__reduce__() hook 处理;它在处理 unpickling 方面为您提供了很大的灵活性;例如不再要求可以导入类本身。

标签: python class serialization hierarchy


【解决方案1】:

如果你提供自定义object.__reduce__() method我相信你仍然可以使用酸洗。

通常情况下,酸洗时,会存储类导入路径以及实例状态。在 unpickling 时,将导入类,并使用存储的状态创建一个新实例。这就是为什么酸洗不能与动态类一起工作,没有什么要导入的。

object.__reduce__() 方法允许您存储一个不同的 实例工厂。此函数返回的可调用对象被存储(再次通过导入路径),并使用指定的参数调用以生成实例。然后使用此实例将状态应用到,就像解开常规实例一样:

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

class SomeDynamicClass(object):
    def __reduce__(self):
        return (class_factory, (type(self).__name__,), self.__dict__)

这里__reduce__ 返回一个函数、函数的参数和实例状态。

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

【讨论】:

    【解决方案2】:

    类是普通的python对象,所以理论上应该是可腌制的,如果你为它们提供__reduce__(或实现其他腌制协议方法)。尝试在他们的元类上定义__reduce__

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 2016-07-13
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      相关资源
      最近更新 更多