getattrの学習

2153 ワード

getattr関数は、実行時まで名前が分からない関数の応用を得ることができます.
>>> li = [ "Larry", "Curly" ]

>>> li.pop

<built-in method pop of list object at 0xb76b364c>

>>> getattr( li, "pop" )

<built-in method pop of list object at 0xb76b364c>

>>> getattr( li, "append" )( "Moe" )

>>> li

['Larry', 'Curly', 'Moe']

>>> 


上のコードからliがわかります.popなどはgetattr(li,「pop」)に用いられるが,これはpop関数を呼び出すのではなく,本格的な
の呼び出しはgetattr(li,append)(「Moe」)です.次の例はgetattr()が表す関数のパラメータの解析であり、
パラメータがappendのパラメータ個数を超えるとエラーが発生することがわかります
>>> getattr( li, "append" )( "Moe1", "Moe2" )

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: append() takes exactly one argument (2 given)

>>> get = getattr( li, "append" )

>>> get( "Moe1" )

>>> li

['Larry', 'Curly', 'Moe', 'Moe1']

>>> 


  
具体的な質問:
以下はstackoverflowで提起された問題です.
 have a str object for example: menu='install'. I want to run install method from this string. For example when I call menu(some, arguments) it will call install(some, arguments). Is there any way to do that ?
次のいずれかのgetattrを使用します.
class MyClass(object):

    def install(self):

          print "In install"



method_name = 'install' # set by the command line options

my_cls = MyClass()

method = getattr(my_cls, method_name)

if not method:

    raise Exception("Method %s not implemented" % method_name)

method()


  
getattrという問題からpythonの重要な機能の自省が見られる.「Dive into python」では、「自省とは、メモリにオブジェクトとして存在する他のモジュールや関数を表示し、その情報を取得して操作することができるコードです.この方法では、名前のない関数を定義したり、関数で宣言されたパラメータ順に関数を呼び出さず、事前に名前を知らなかった関数を参照したりすることができます.」と説明しています.
 
参考資料:
stackoverflow Webサイト
              《Dive into python》