__getattr__死循环的问题

2018-08-08 11:40:57 +08:00
 yannick
class Proxy:
def __init__(self, obj):
# self._obj = obj,则调用__getattr__就会死循环,而改成 self._obj = obj,则不会;
self.obj = obj

def __getattr__(self, item):
return getattr(self.obj, item)


class Spam:
def __init__(self, x):
self.x = x

def bar(self, y):
print('Spam.bar:', self.x, y)


if __name__ == "__main__":
spam = Spam(10.05)
proxy = Proxy(spam)
print(proxy.x)

仅仅是将 Proxy 实例属性由_obj 的成 obj,就会造成__getattr__无限循环,这个怎么理解?谢谢。
1817 次点击
所在节点    Python
3 条回复
ngnetboy
2018-08-08 13:39:33 +08:00
不知道你的环境是什么样的,使用你的代码跑了一下,没发现什么问题。
zhusimaji
2018-08-08 13:47:31 +08:00
哈哈,楼主肯定是在__init__初始化函数改了,忘记在 getattr 里面修改了,导致在获取的时候无线循环一直到报 error
<script src="https://gist.github.com/zhusimaji/df879dd537a6729b6201f456e2c08b71.js"></script>
yannick
2018-08-08 14:38:48 +08:00
@ngnetboy @zhusimaji 谢谢二位,原因找到了!有一段__setattr__的代码没贴出来,在__setattr__中调用了__getattr__,没做一些拦截处理,造成重复调用__getattr__,话说,这几个魔术方法真是死循环的高危险操作呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/477884

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX