Why does __get__ take an owner while __set__ and __delete__ do not?(为什么 __get__ 获取所有者而 __set__ 和 __delete__ 不获取?)
问题描述
来自 Python 数据模型文档:p><块引用>
object.__get__(self, instance, owner=None)
调用以获取所有者类的属性(类属性访问)或该类的实例(实例属性访问).可选的 owner 参数是所有者类,而 instance 是访问属性的实例,或者 None 访问属性时所有者.
此方法应返回计算的属性值或引发 AttributeError 异常.
PEP 252 指定 __get__() 可以用一个或两个参数调用.Python 自己的内置描述符支持此规范;但是,某些第三方工具可能具有需要两个参数的描述符.Python 自己的 __getattribute__() 实现总是传入两个参数,无论它们是否需要.
object.__set__(self, instance, value)
调用以将所有者类的实例 instance 上的属性设置为新值 value.
注意,添加 __set__() 或 __delete__() 会将描述符的种类更改为数据描述符".有关详细信息,请参阅调用描述符.
object.__delete__(self, instance)
调用来删除所有者类的实例instance上的属性.
为什么 __get__ 使用 owner 而 __set__ 和 __delete__ 没有?
是不是意味着当一个描述符同时提供__get__和__set__时,
- 无论是属于所有者类的实例还是属于所有者类,我们都可以得到一个属性,
- 我们可以设置和删除属于所有者类实例的属性,但不能在属于所有者类时设置和删除?
我的问题实际上是这个的一部分.
owner 主要用于获取类本身的属性,而不是实例.当您检索实例的属性时,owner 参数是多余的,因为它只是 type(instance).
__set__ 不适用于设置类本身的属性,所以 owner 没有用.
From the Python data model documentation:
object.__get__(self, instance, owner=None)Called to get the attribute of the owner class (class attribute access) or of an instance of that class (instance attribute access). The optional
ownerargument is the owner class, whileinstanceis the instance that the attribute was accessed through, orNonewhen the attribute is accessed through theowner.This method should return the computed attribute value or raise an
AttributeErrorexception.PEP 252 specifies that
__get__()is callable with one or two arguments. Python’s own built-in descriptors support this specification; however, it is likely that some third-party tools have descriptors that require both arguments. Python’s own__getattribute__()implementation always passes in both arguments whether they are required or not.
object.__set__(self, instance, value)Called to set the attribute on an instance
instanceof the owner class to a new value, value.Note, adding
__set__()or__delete__()changes the kind of descriptor to a "data descriptor". See Invoking Descriptors for more details.
object.__delete__(self, instance)Called to delete the attribute on an instance
instanceof the owner class.
Why does __get__ take an owner while __set__ and __delete__ do not?
Does it mean that when a descriptor supplies both __get__ and __set__,
- we can get an attribute no matter whether it belongs to an instance of the owner class or to the owner class,
- we can set and delete an attribute when it belongs to an instance of the owner class but not when it belongs to the owner class?
My question is actually part of this one.
owner mostly exists for getting the attribute on the class itself, rather than an instance. When you're retrieving the attribute on an instance, the owner argument is redundant, since it's just type(instance).
__set__ doesn't apply to setting the attribute on the class itself, so it has no use for owner.
这篇关于为什么 __get__ 获取所有者而 __set__ 和 __delete__ 不获取?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么 __get__ 获取所有者而 __set__ 和 __delete__ 不获取?
基础教程推荐
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
- 修改列表中的数据帧不起作用 2022-01-01
- 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
- 包装空间模型 2022-01-01
- 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
- 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
- PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
- 求两个直方图的卷积 2022-01-01
- 在Python中从Azure BLOB存储中读取文件 2022-01-01
- Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
