2011-11-20 19 views
1

我一直在阅读关于getattr()函数潜入python。从这本书中我知道它对模块很有用 - 没有任何问题!我做过一些测试,我不知道什么是错的代码片段,我使用的getattr()与特定的变量:getattr()函数如何与变量一起使用?

var="lol" 
a=getattr(var,"join") 

a(["A","B","C"]) # output: 'AlolBlolC' 

var="lll" 
a(["A","B","C"]) # output: 'AlolBlolC' - I thought It should have been 'AlllBlllC' 

在另一方面:

var.join(["A","B","C"]) # output:'AlllBlllC' 

我不明白为什么在'111'上更改变量'var'后,它不能与引用'a'一起工作,但以正常方式使用变量名称工作。

在此先感谢!

+0

你在'x = 1之后是否感到'y'等于2(而不是3)? y = x + 1; x = 2'?如果没有,为什么这种行为会让你感到惊讶? – delnan

回答

5

在Python中,赋值给变量不会改变变量引用的对象。它只是为变量分配一个不同的对象。 a保留的方法仍然绑定到当您调用getattr()时引用的字符串var

0

从我的理解来看,这与getattr无关。考虑

obj = "x" 
meth = obj.join 
print meth("ABC") # AxBxCx 

obj = "y" 
print meth("ABC") # AxBxCx 

http://docs.python.org/tutorial/classes.html

当一个实例属性中引用这不是一个数据属性,搜索它的类。如果名称表示一个有效的类属性,它是一个函数对象,则通过打包(指向)实例对象和在抽象对象中一起找到的函数对象来创建方法对象:这是方法对象。

换句话说,var=obj.someMethod创建了一个闭包,该闭包捕获方法中的self。如前所述,稍后赋值给变量对闭包没有影响,因为它引用了对象本身而不是变量。

相关问题