当我设置属性时,getattr
结果' id
更改为值id
。
当我设置方法时,getattr
结果id
不会发生变化。
为什么?
class A (object):
a = 1
a = 42
print id(getattr(A, 'a'))
print id(a)
setattr(A, 'a', a)
print id(getattr(A, 'a'))
# Got:
# 36159832
# 36160840
# 36160840
class B (object):
def b(self):
return 1
b = lambda self: 42
print id(getattr(B, 'b'))
print id(b)
setattr(B, 'b', b)
print id(getattr(B, 'b'))
# Got:
# 140512684858496
# 140512684127608
# 140512684858496
答案 0 :(得分:3)
区别在于方法在python中的工作方式
请注意
>>> B.b
<unbound method B.<lambda>>
方法实际上是使用descriptors
构建的更新&#34;方法&#34;,描述符不会改变
查看描述符内部,我们发现底层函数
class B (object):
def b(self):
return 1
b = lambda self: 42
print id(getattr(B, 'b'))
print id(b)
setattr(B, 'b', b)
print id(getattr(B, 'b'))
print id(getattr(B, 'b').im_func) # grab function from the descriptor
4424060752
4440057568
4424060752
4440057568 # here's our new lambda
您还可以查看
B.__dict__['b']
之前和之后