Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pickle使用getattr实现了循环递归?_Python_Pickle_Getattr - Fatal编程技术网

Python pickle使用getattr实现了循环递归?

Python pickle使用getattr实现了循环递归?,python,pickle,getattr,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

我得到:

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)
类测试(对象):
定义初始化(self,a):
self.a=a
def _ugetattr _;(self,name):
a=对象。\ uuuu获取属性\ uuuuuuuu(self,'a')
返回一个.。\uuuu getattr\uuuuu(a,名称)
从pickle导入装载、转储
负载(转储((测试({})))
# 
我会使用
getattr()
而不是
\uuuu getattr\uuuu
。这相当于调用
getattr(Test(a).a,name)
。这首先转到
a.。\uuuuu getattribute\uuuuu
,如果失败,则转到
a.\uuuu getattr\uuuu

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>
class Test(object):
    def __init__(self, a):
        self._a = a

    def __getattr__(self, name):
        a = object.__getattribute__(self, '_a')
        return getattr(a, name)