__getattr__在python中递归

Par*_*ngh 5 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"
Run Code Online (Sandbox Code Playgroud)

这里当我添加__setattr__ self.list1是递归的,因为__getattr__在每次之后调用self.list1并且这种递归是不可阻挡的.你能帮我解决一下吗?我需要这样实现.

谢谢

Nat*_*ert 8

首先,这是一个完全奇怪的用法__getattr__,但我会假设你知道这一点.

基本上,问题是__setattr__每次你做这样的事情总是被调用self.foo = bar,所以如果你在__setattr__你内部使用它,你最终会得到你得到的递归.您需要做的是插入您尝试直接设置的值__dict__ self.__dict__['foo'] = bar.

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