2011-11-20 83 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。如前所述,稍後賦值給變量對閉包沒有影響,因爲它引用了對象本身而不是變量。

相關問題