2007年08月20日

Python | 存在しないメソッドの呼び出し

PHP: オーバーロード - Manual

特別なメソッド __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
Posted by otsuka : 01:37 | Comment (2) | Trackback (0)
Comment

元々もってる属性にアクセスしてるかなどはinspectモジュール使うなりすればいいと思うけど。あとはxxxから始まる名前の場合はメソッドを返すなどのルール決めの問題かねー

Posted by: mopemope : 2007年08月20日 10:16

> 元々もってる属性にアクセスしてるかなどはinspectモジュール使うなりすればいいと思うけど。

うんうん。

foo.test が呼ばれたのか、foo.test() が呼ばれたのか、つまり()があるのかないのかが__getattribute__で分かればいいんだけどねー。

Posted by: otsuka : 2007年08月20日 13:43









名前、アドレスを登録しますか?