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