python:setattr的迷惑以及函式作為物件新增引用
阿新 • • 發佈:2019-02-03
import sys
class A:
def __init__(self,str):
self.str=str
setattr(self.__class__,self.str,self.test)
def test(self):
print sys._getframe().f_code.co_name
print self.str
if __name__=='__main__':
a=A("haha")
a.haha()
這是在一個博主的部落格裡看到的程式碼,輸出是
test
haha
我百思不得其解的是,為什麼最後一句是a.haha()呼叫,setattr函式不是吧test變數名賦值給了變數str嗎,那應該是a.str才
對啊。為了趕時間,匆匆學完python,python語法不牢固,結果浪費更多時間。
最後我沒得出原理性的解釋,只是通過一個實驗證明了,在setattr中,self.str已經被替換成了haha
例如
class A:
name = "habi"
def __init__(self,x):
self.name = x
a = A('shabi')
setattr(a, a.name, 'niubi')
print(a.__dict__)
print(a.name)
輸出為:
D:\python\python.exe F:/python/Tree/two.py
{'name': 'shabi', 'shabi': 'niubi'}
shabi
Process finished with exit code 0
可以看出,變數name的值還是shabi,而niubi賦給了新建的變數shabi