我正在尝试序列化具有外部依赖性的类。
创建类的方式是,它在其init函数中接收一个配置,并创建一个接收该配置并将其分配给self的对象。
我要完成的工作是,我要序列化该类,并根据创建的上下文,希望能够注入一个不同的配置。
class Foo:
def __init__(self, some_value, config):
self.some_value = some_value
self.some_service = SomeService(config)
在这种情况下,我想要的是对self.some_value进行序列化,而不要对self.some_service进行序列化(并且在更改后也不能配置)。
那么,正确的模式是什么?我看过getstate / setstate dunder,它非常适合仅序列化该类的一部分,但在取消拾取时不注入config。我本来希望Unpickler在这种情况下可以完美地工作,但是看起来却不是这样(由于某种原因,它似乎只能与文件一起使用?数据在redis DB中被序列化,因此没有文件)。我宁愿也没有服务定位器,但注入配置而不是获取配置。
说明:
问题不在于如何使用泡菜或泡菜。问题更多是模式的选择。我在对象中有外部依赖关系(由self.some_service = SomeService(config)
表示)。
有两种方法可以在解开时重建该对象:
两者都有优点和缺点,但是我想知道推荐哪一个。取消拾取时,取消拾取器可以具有外部依赖关系,并且在取消拾取时,可以将其重新分配给对象,但这似乎是一个“繁重的”解决方案。使用get / setstate dunder要求让类知道如何获取外部依赖项,并且看起来有点“神奇”(该类感染外部服务,而不是将它们提供给该类)。
答案 0 :(得分:0)
我最终得到的解决方案本质上有点像服务定位器:我实例化实例,然后调用自定义for