【发布时间】:2012-03-20 08:07:00
【问题描述】:
我有一个 python pickle 文件,当我尝试加载它时,我希望它先加载一个特定对象(因为我有一些依赖项......)。
这可能吗?
这是场景:
class A:
def __init__(self):
self.known_names = ["Dan", "David"]
def __getattr__(self, name):
if name not in self.known_names:
raise UnknownName
else:
return self[name]
class B:
def __init__(self):
self.a_instance = A()
def __setattr__(self, name, value):
if self.a_instance.attr == "something":
do_something...
def __setstate__(self):
self.foo = "blah"
加载pickle文件时出现问题。 B 类实例在 A 类之前加载。在这种情况下,B 类的__setstate__ 方法尝试设置self.foo。这导致__settattr__ 方法调用检查self.a_instance 的attr 属性。但是,A 类尚未解封,因此 self.known_names 不存在。所以调用 A 的 __getattr__ 会导致无限递归(因为 known_names 不存在,它也会调用 __getattr__)。
【问题讨论】: