getattr的学习

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 网站

              《Dive into python》

posted @ 2011-10-29 12:42  lxgeek  阅读(1460)  评论(0编辑  收藏  举报