我按照以下方式声明了一个类
class A:
def __init__(self, list_1, list_2):
self.list1 = list_1
self.list2 = list_2
def __getattr__(self, item):
if item in self.list1: return "It is in list 1"
elif item in self.list2: return "It is in list 2"
else: return "It is in neither list 1 nor list 2"
当我添加__setattr__
self.list
时,1递归,因为__getattr__
在每self.list1
之后被调用,并且此递归是不可阻挡的。你能帮我解决一下吗?我需要这样实现。
由于
答案 0 :(得分:7)
首先,这是对__getattr__
的完全奇怪的用法,但我会假设您知道这一点。
基本上,问题是__setattr__
总是在每次执行self.foo = bar
之类的操作时被调用,所以如果你在__setattr__
内使用它,你最终会得到你的递归拿到。您需要做的是将您尝试设置的值直接插入__dict__
self.__dict__['foo'] = bar
。
如果你正在使用新的样式类(即A
是object
的后代),那么你也可以super(A, self).__setattr__(item, value)
甚至只object.__setattr__(self, item, value)