私が遭遇した小さな問題を共有します。次のような Python コードがあります。
クラス A(オブジェクト):
@プロパティ
def _value(self):
# AttributeError("test")
を発生させる
return {"v": "これはテストです。"}
def __getattr__(self, key):
print "__getattr__:", key
return self._value[key]
if __name__ == '__main__':
a = A()
印刷版
この行のコメントが削除されると、つまり _value メソッドで AttributeError 例外がスローされると、状況は少しおかしくなります。プログラムは実行時に例外をスローしませんが、無限再帰に入ります:
複数の関係者を調査した結果、プロパティ デコレーターに問題があることが判明しました。プロパティは実際には記述子です。このようなテキストは Python ドキュメントにあります:
所有者クラス (クラス属性アクセス) またはそのクラスのインスタンスの属性 (インスタンス属性アクセス) を取得するために呼び出されます。所有者は常に所有者クラスですが、インスタンスは属性にアクセスしたインスタンスです。または、属性が所有者を通じてアクセスされる場合、このメソッドは (計算された) 属性値を返すか、AttributeError 例外を発生させる必要があります。
このように、ユーザーが ._value にアクセスすると、AttributeError がスローされ、__getattr__ メソッドが呼び出されて取得が試みられます。このようにして、プログラムは無限再帰になります。
この問題は複雑ではないようですが、_value メソッドが比較的微妙な方法で AttributeError をスローする場合、デバッグがより困難になります。