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"

ここで 1 を追加すると__setattr__ self.list__getattr__get が毎回呼び出されself.list1、この再帰は止められないため、再帰的になります。それを手伝ってくれませんか。このように実装する必要があります。

ありがとう

4

1 に答える 1

12

まず第一に、これは のまったく奇妙な使用法ですが__getattr__、あなたはそれを知っていると仮定します。

基本的に、問題は、 の__setattr__ようなことをするたびに常に呼び出されることですself.foo = bar。そのため、その中でそれを使用する__setattr__と、取得した再帰が発生します。あなたがする必要があるのは、設定しようとしている値を に直接挿入することです__dict__ self.__dict__['foo'] = bar

新しいスタイル クラスを使用している (つまりAの子孫であるobject) 場合は、次のこともできますsuper(A, self).__setattr__(item, value)object.__setattr__(self, item, value)

于 2012-06-21T19:49:41.530 に答える