__getattr__在python中递归

时间:2012-06-21 19:36:17

标签: python python-2.7

我按照以下方式声明了一个类

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之后被调用,并且此递归是不可阻挡的。你能帮我解决一下吗?我需要这样实现。

由于

1 个答案:

答案 0 :(得分:7)

首先,这是对__getattr__的完全奇怪的用法,但我会假设您知道这一点。

基本上,问题是__setattr__总是在每次执行self.foo = bar之类的操作时被调用,所以如果你在__setattr__内使用它,你最终会得到你的递归拿到。您需要做的是将您尝试设置的值直接插入__dict__ self.__dict__['foo'] = bar

如果你正在使用新的样式类(即Aobject的后代),那么你也可以super(A, self).__setattr__(item, value)甚至只object.__setattr__(self, item, value)

相关问题