2007年8月20日
Python | 存在しないメソッドの呼び出し
特別なメソッド __call() を使用すると、存在しないメソッドの呼び出しを捕捉することができます。
PythonでこのPHPの_call()に該当する特殊メソッドはなかったっけ?
PHPマニュアルの「__call を使ったオーバーロードの例」をPythonで書いてみた。サクッと書いた分にはこんなやり方しか思いつかなかったけど、これだとCallerインスタンスのメソッドが呼ばれたのか属性にアクセスしようとしたのか分からない。他に定石なやり方がありそうな気がする。
class Caller(object):
def __getattribute__(self, name):
def missing_method_call(*args):
print "Method %s called:" % (name,)
print args
return (1, 2, 3)
return missing_method_call
foo = Caller()
a = foo.test(1, "2", 3.4, True)
print a
追記
ちょっと冗長になるけれど、クロージャを使わずにやる方法も。
class MissingMethodCall(object):
def __init__(self, name):
self.name = name
def __call__(self, *args):
print "Method %s called:" % (self.name,)
print args
return (1, 2, 3)
class Caller(object):
def __getattribute__(self, name):
return MissingMethodCall(name)
foo = Caller()
a = foo.test(1, "2", 3.4, True)
print a
Comment
元々もってる属性にアクセスしてるかなどはinspectモジュール使うなりすればいいと思うけど。あとはxxxから始まる名前の場合はメソッドを返すなどのルール決めの問題かねー
Posted by: mopemope : 2007年8月20日 10:16
> 元々もってる属性にアクセスしてるかなどはinspectモジュール使うなりすればいいと思うけど。
うんうん。
foo.test が呼ばれたのか、foo.test() が呼ばれたのか、つまり()があるのかないのかが__getattribute__で分かればいいんだけどねー。
Posted by: otsuka : 2007年8月20日 13:43