Pythonで動的にメソッドを呼ぶ

インスタンスのメソッドを動的に呼び出す方法はどうするんだろう?と思ってたらなんてことはない。
getattrで関数オブジェクトとして取得して、それに「()」を付けて呼び出せば良かった。
※getattrするので存在しないメソッドを呼んだ場合は例外が送出される。

Target(object):
     def foo(self):
          print foo

target = Target()

target.foo()
#> foo

methodname = 'foo'
try:
     method = getattr(target, methodname)
except AttributeError:
     exit
method()

#> foo

みたいな感じでできる。


スコープの外から呼んでも大丈夫だけど、GCの都合もあるので使い終わったら参照切るようにした方がいいかも。と思ったけど確実に切れるかって言うとそうでもないしまあ。よしなに。

# -*- coding: utf-8 -*-

class Temp(object):
    def __init__(self):
        self.tempparam = 'abc'

    def func1(self):
        print 'func1'
        print self.tempparam
    def func2(self):
        print 'func2'
        print self.tempparam

def test():
    temp = Temp()
    
    try:
        method = getattr(temp, 'func1')
    except AttributeError:
        print 'error'

    method()

    temp.tempparam = 'cde'

    method()

    return method
method = test()
method()