重複の可能性:
Rubyの「method_missing」に相当するPython
Rubyのmethod_missingテクニックのように、メッセージ(メソッド呼び出し)をインターセプトするためにPythonで利用できるテクニックはありますか?
重複の可能性:
Rubyの「method_missing」に相当するPython
Rubyのmethod_missingテクニックのように、メッセージ(メソッド呼び出し)をインターセプトするためにPythonで利用できるテクニックはありますか?
他の人が述べたように、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
オーバーロード__getattr__
して、そこから呼び出し可能オブジェクトを返すことができます。Pythonは2つのステップで呼び出すため、属性のルックアップ中に、要求された属性が呼び出されることを意図しているかどうかを判断できないことに注意してください。