Discuss / Python / 请教一下,为什么这里 类名.变量名=值,无法修改类中变量的值

请教一下,为什么这里 类名.变量名=值,无法修改类中变量的值

Topic source

久处不厌

#1 Created at ... [Delete] [Delete and Lock User]
def dict2bean(obj, dic):
    for k, v in dic.items():
        if hasattr(obj, k):
            obj.k = v  #这里无法修改类中a,d的值,使用setattr(obj,k,v)就可以

class obj():
    d=1
    def __init__(self,a):
        self.a=a


dic={'a':3,'d':88}
x=obj(12)
dict2bean(x, dic)

print(x.a)
print(x.d)

为什么obj.k=v 不会修改类obj中a,d的值,而使用setattr(obj,k,v)就可以用字典的键值替换掉obj中变量的值

当使用obj.k=v 时,x.a=12,x.d=1

当使用setattr(obj,k,v)时,x.a=3,x.d=88

咸鱼

#2 Created at ... [Delete] [Delete and Lock User]
 obj.k = v 

这个语句的意思是将obj对象的k属性设为v,并不是你想的

 obj.a = v 

 obj.d = v 

Ü

#3 Created at ... [Delete] [Delete and Lock User]

请教为什么这句会判定为TRUE呢?

if hasattr(obj, k):

因为你这里相当于指针引用, 不能直接操作. 你可以查看一下内存地址对比一下

不器

#5 Created at ... [Delete] [Delete and Lock User]

请教为什么这句会判定为TRUE呢?

x实例里有属性a和d,k变量就是a或b

maxilo

#6 Created at ... [Delete] [Delete and Lock User]

哈希比较的是字符串的值,k指向的是字符串,明确写obj.name的意思是指向的是实例属性,obj.k !=转换成 obj.name而是新增一个k属性


  • 1

Reply