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》

你可能感兴趣的:(attr)