16

重複の可能性:
Rubyの「method_missing」に相当するPython

Rubyのmethod_missingテクニックのように、メッセージ(メソッド呼び出し)をインターセプトするためにPythonで利用できるテクニックはありますか?

4

2 に答える 2

46

他の人が述べたように、Python で を実行するo.f(x)と、実際には 2 段階の操作になります。最初に のf属性を取得し、oそれをパラメーターで呼び出しますx。属性がないために失敗する最初のステップでありf、Python マジック メソッドを呼び出すのはそのステップです__getattr__

したがって、 を実装する__getattr__必要があり、それが返すものは呼び出し可能でなければなりません。も取得しようとするo.some_data_that_doesnt_existと、同じ__getattr__ものが呼び出され、それが「データ」属性と検索されている「メソッド」であることを認識できないことに注意してください。

callable を返す例を次に示します。

class MyRubylikeThing(object):
    #...

    def __getattr__(self, name):
        def _missing(*args, **kwargs):
            print "A missing method was called."
            print "The object was %r, the method was %r. " % (self, name)
            print "It was called with %r and %r as arguments" % (args, kwargs)
        return _missing

r = MyRubylikeThing()
r.hello("there", "world", also="bye")

生成:

A missing method was called.
The object was <__main__.MyRubylikeThing object at 0x01FA5940>, the method was 'hello'.
It was called with ('there', 'world') and {'also': 'bye'} as arguments
于 2011-08-05T11:53:13.127 に答える
0

オーバーロード__getattr__して、そこから呼び出し可能オブジェクトを返すことができます。Pythonは2つのステップで呼び出すため、属性のルックアップ中に、要求された属性が呼び出されることを意図しているかどうかを判断できないことに注意してください。

于 2011-08-05T09:30:57.067 に答える