Python pickle 出现递归循环与 getattr?

5 投票
2 回答
647 浏览
提问于 2025-04-18 00:48
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)

撰写回答