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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值