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上提出的一个问题
然后其中的一个用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》