Python pickle 出现递归循环与 getattr?
class Test(object):
def __init__(self, a):
self.a = a
def __getattr__(self, name):
return getattr(self.a, name)
from pickle import loads, dumps
loads(dumps((Test(something),)))
我遇到了:
7 def __getattr__(self, name):
----> 8 return getattr(self.a, name)
RuntimeError: maximum recursion depth exceeded
有没有什么提示?
我可以通过修改代码来解决这个问题:
if 'a' in self.__dict__:
return getattr(self.a, name)
但我不想这样做。有没有更好的解决办法?
谢谢
2 个回答
0
这个方法应该是可行的,不过我觉得这样做不是个好主意...
class Test(object):
def __init__(self, a):
self.a = a
def __getattr__(self, name):
a = object.__getattribute__(self, 'a')
return a.__getattr__(a, name)
from pickle import loads, dumps
loads(dumps((Test({}))))
# <__main__.Test at 0x7f6beb8>
2
我会使用 getattr()
而不是 __getattr__
。这样做相当于调用 getattr(Test(a).a, name)
。这个过程首先会调用 a.__getattribute__
,如果这个方法找不到你要的属性,就会转而调用 a.__getattr__
。
class Test(object):
def __init__(self, a):
self._a = a
def __getattr__(self, name):
a = object.__getattribute__(self, '_a')
return getattr(a, name)