3

現在のクラスまたはその先祖に存在しない属性にアクセスしようとすると、メンバーからそれらの属性にアクセスしようとするクラスを実装しようとしています。以下は、私がやろうとしていることの簡単なバージョンです。

class Foo:
    def __init__(self, value):
        self._value = value

    def __getattr__(self, name):
        return getattr(self._value, name)

if __name__ == '__main__':
    print(Foo(5) > Foo(4)) # should do 5 > 4 (or (5).__gt__(4))

ただし、これによりTypeError. operatorモジュールのattrgetterクラスを使用しても同じことができます。属性アクセスのカスタマイズに関するドキュメントを見ていましたが、簡単に読めるものではありませんでした。どうすればこれを回避できますか?

4

2 に答える 2

7

私があなたを正しく理解していれば、あなたがしていることは正しいですが、あなたがそれを使おうとしている目的ではまだうまくいきません. __getattr__その理由は、暗黙的なマジック メソッド ルックアップが(または__getattribute__他のそのようなもの)を使用しないためです。メソッドは、実際には魔法の名前で明示的に存在する必要があります。あなたのアプローチは通常の属性では機能しますが、魔法の方法では機能しません。(明示的に行うと機能することに注意してくださいFoo(5).__lt__(4)。暗黙的な「魔法の」ルックアップにすぎません --- たとえば、__lt__when<が使用されている場合の呼び出しなど) --- それはブロックされます。)

この投稿では、メタクラスを使用してマジック メソッドを自動生成する方法について説明します。特定のメソッドのみが必要な場合は、クラスでそれらを手動で定義できます。

于 2012-09-07T03:43:16.883 に答える
1

__*__メソッドは実際に存在しない限り機能しません。したがって、これらの呼び出しをプロキシすること__getattr__も許可しません。__getattribute__すべてのメソッドを手動で作成する必要があります。

はい、これにはかなりのコピー&ペーストが必要です。はい、この場合はまったく問題ありません。

werkzeug LocalProxyクラスをベースとして、または独自のクラスの代わりに使用できる場合があります。を使用すると、コードは次のようになりますLocalProxy

print(LocalProxy(lambda: 5) > LocalProxy(lambda: 4))
于 2012-09-07T03:41:37.037 に答える