gpt4 book ai didi

python - 为什么 setattr 对属性和方法的作用不同?

转载 作者:太空狗 更新时间:2023-10-30 00:10:05 24 4
gpt4 key购买 nike

当我设置一个属性时,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

最佳答案

不同之处在于方法在 python 中的工作方式

注意

>>> B.b
<unbound method B.<lambda>>

方法实际上是使用 descriptors 构建的

更新“方法”,描述符没有改变

查看描述符内部,我们发现底层函数确实如此

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']

前后

关于python - 为什么 setattr 对属性和方法的作用不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35318934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com