1. ホーム
  2. python

[解決済み] 無限再帰エラーを起こさずに __getattribute__ を実装するには?

2022-09-16 13:45:45

質問

あるクラスで、ある変数へのアクセスをオーバーライドしたいのですが、他の変数は普通に返したいです。 どのように私はこれを達成するために __getattribute__ ?

次のように試してみましたが(これも私がやろうとしていることを説明しているはずです)、再帰エラーが発生します。

class D(object):
    def __init__(self):
        self.test=20
        self.test2=21
    def __getattribute__(self,name):
        if name=='test':
            return 0.
        else:
            return self.__dict__[name]

>>> print D().test
0.0
>>> print D().test2
...
RuntimeError: maximum recursion depth exceeded in cmp

どのように解決するのですか?

をアクセスしようとすると、再帰エラーが発生します。 self.__dict__ 属性の内部で __getattribute__ は、あなたの __getattribute__ を再び呼び出します。もし object 's __getattribute__ の代わりに、それは動作します。

class D(object):
    def __init__(self):
        self.test=20
        self.test2=21
    def __getattribute__(self,name):
        if name=='test':
            return 0.
        else:
            return object.__getattribute__(self, name)

これは object (この例では) が基底クラスであるからです。のベースバージョンを呼び出すことで __getattribute__ を呼び出すことで、以前のような再帰的な地獄を避けることができます。

foo.pyのコードでIpythonの出力。

In [1]: from foo import *

In [2]: d = D()

In [3]: d.test
Out[3]: 0.0

In [4]: d.test2
Out[4]: 21

更新しました。

というセクションに何かあるようです。 新しいスタイルのクラスに対するより多くの属性アクセス で、無限再帰を避けるためにまさにこれを行うことを推奨しています。