1. 程式人生 > >python:setattr的迷惑以及函式作為物件新增引用

python:setattr的迷惑以及函式作為物件新增引用

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