gpt4 book ai didi

python - 为什么描述符 __get__ 可以访问对象的类型但 __set__ 不能?

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:31 24 4
gpt4 key购买 nike

来自 https://docs.python.org/2/howto/descriptor.html :

descr.__get__(self, obj, type=None) --> value

descr.__set__(self, obj, value) --> None

descr.__delete__(self, obj) --> None

为什么 __get__ 方法可以访问 type 而其他两个方法不能?

最佳答案

__get__ 中,type 参数是一个类名,这在通过类访问属性时很有用,因为在这种情况下 obj(实例)将为 None。在 __set__ 中,您不需要 type 参数,因为无法通过类设置描述符的值,您只需用新值覆盖描述符即可。

考虑以下代码

class RevealAccess(object):
"""A data descriptor that sets and returns values
normally and prints a message logging their access.
"""

def __init__(self, initval=None, name='var'):
self.val = initval
self.name = name

def __get__(self, obj, objtype):
print 'Retrieving', self.name
return self.val

def __set__(self, obj, val):
print 'Updating', self.name
self.val = val

>>> class MyClass(object):
... x = RevealAccess(10, 'var "x"')
... y = 5
...
>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> MyClass.x # accessing descriptor x through class
Retrieving var "x"
20
>>> MyClass.x = 20 # class parameter x is overwritten with value 20, it's not a descriptor any more
>>>

关于python - 为什么描述符 __get__ 可以访问对象的类型但 __set__ 不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47114950/

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