Discuss / Python / 请教一下各位 test = Test() setattr(test,'b',2) 和 setattr(Test(),'b',2) 有什么区别

请教一下各位 test = Test() setattr(test,'b',2) 和 setattr(Test(),'b',2) 有什么区别

Topic source

class Test(object): def init(self): self.a = 1 def add_self(self): return self.a + self.a test = Test() setattr(test,'b',2) print(hasattr(test,'b'))

结果为True

class Test(object): def init(self): self.a = 1 def add_self(self): return self.a + self.a setattr(Test(),'b',2) print(hasattr(Test(),'b'))

结果为False

为什么会出现这种结果呢?

因为你两次调用了Test()这样生成了两个Test object,所以第二个object并不含有b attribute.

守候986

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

print(test)

<__main__.Test object at 0x0000000001E50BE0> print(Test())

<__main__.Test object at 0x0000000001E50940> 可以发现print(test)和print(Test())内存地址不一样。 也就是说test != Test() 你对实例对象test创建了属性'b'不代表Test()也拥有属性'b',因为每次实例化的结果和地址都是不同的。 个人观点勿喷

第二个程序里setattr(Test(),'b',2) print(hasattr(Test(),'b'))改为setattr(Test(),'b',2) print(hasattr(Test(),'b'))就对了。

第二个程序里setattr(Test(),'b',2) print(hasattr(Test(),'b'))改为setattr(Test,'b',2) print(hasattr(Test,'b'))就对了。

刚刚那个输错了……

看了其他人的讨论,发现我回答的有点问题。按照我的改法,Test并非Test类,而是type类。楼主的问题是setattr(Test(),'b',2)和hasattr(Test(),'b')这两个代码中的Test()并非同一个实例。Test()==Test()的结果是False。


  • 1

Reply