gpt4 book ai didi

python - 了解 Python 描述符

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:38 25 4
gpt4 key购买 nike

我正在尝试更好地理解描述符。

我不明白为什么在 foo 方法中描述符 __get__ 方法未被调用。

据我了解描述符 __get__ 当我通过点运算符访问对象属性或使用 __getattribute__() 时,方法总是被调用.

根据Python documentation :

class RevealAccess(object):
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

def foo(self):
self.z = RevealAccess(13, 'var "z"')
self.__getattribute__('z')
print(self.z)

m = MyClass()
m.foo()
m.z # no print
m.x # prints var x

最佳答案

z实例 上的属性,而不是类上的属性。描述符协议(protocol)仅适用于从类中检索的属性。

来自Descriptor HOWTO :

For objects, the machinery is in object.__getattribute__() which transforms b.x into type(b).__dict__['x'].__get__(b, type(b)).

并且在 Implementing Descriptors section Python 数据模型:

The following methods only apply when an instance of the class containing the method (a so-called descriptor class) appears in an owner class (the descriptor must be in either the owner’s class dictionary or in the class dictionary for one of its parents).

类字典中找不到你的m.ztype(m).__dict__['z'] 不存在;它位于 m.__dict__['z'] 中。这里m是实例,owner类是MyClassz没有出现在中所有者类字典。

关于python - 了解 Python 描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929502/

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