问题标签 [python-descriptors]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 如何观察 Python 中的属性查找链?
我正在尝试深入研究 Python 的类描述符,并且遇到了一篇解释类属性查找链的文章。也就是说第一优先是__get__
数据描述符的方法(即实现__set__
or__delete__
方法的类。然后是对象的dict ,然后是非数据描述符的get方法。
这对我来说似乎非常令人困惑,我无法找到一个真实的例子来展示数据描述符如何在实例的dict查找之前出现。我真的很感激一个用print
s 说明这个理论东西的最小例子。
python - “__get__”参数之一是多余的吗?
如此处所述:
https://docs.python.org/3/reference/datamodel.html#object.__get__
传递给 __get__ 方法的两个参数(不包括“self”)分别是对象和访问属性的类。第二个参数不是多余的吗?此外,当“类”也是对象时,为什么需要区分对象和类访问?
所以,在我看来,有两种可能性:
- 从对象访问属性,在这种情况下,所有者参数将等于type( instance ),因此它不会带来新信息
- 属性从一个类(“类型”的对象)中访问,在这种情况下,源对象只是位于所有者参数中,实例为None
在我看来,如果只使用一个参数(例如instance),则可以实现相同的功能,该参数将始终保存原始对象,无论它是否是“类”。如果确实需要该信息,则可以使用isinstance(instance, type)
.
那么,为什么需要这两个参数呢?
python-3.x - python3在元类中实现数据描述符
在元类中实现数据描述符的正确方法是什么?在下面的(简单的)示例中,我希望始终在设置所需的值之前附加一个问号:
首先,当我将 var 初始化为 5 时,似乎没有使用描述符。我也可以在这里应用描述符协议吗?(设为“5?”)其次,在 __set__ 方法中应该如何更新值?更新 __dict__ 给我"TypeError: 'mappingproxy' object does not support item assignment"并使用 setattr 给我"RecursionError: maximum recursion depth exceeded while calling a Python object"。
python-3.x - Python 3 触发隐式值更改的回调
callback
每当对象的某个属性发生更改时,我都希望调用一个A
。
我知道这个问题与 Python 中的观察者模式和描述符有关。但是,描述符似乎只能通过点访问来检测显式更改。
例如:
在上面的代码中,回调只被调用一次来初始化data
. 但是,我希望它被调用 3 次。我不依赖于使用描述符,但我确实希望该方法适用于任何数据类型,例如list
,dict
等等。
python - 为什么在 hassattr() 中调用 Python 中描述符的 __get__ 方法?
认为
然后在调用期间hasattr(c,"d1")
调用__get__
方法C.d1
。为什么?不应该hasattr()
只查字典吗?
<tab>
在交互式 CPython-version-3.6.10 会话中按下完成时会发生相同(但更奇怪) ,如c.d<tab>
. 在这种情况下__get__
,将为除最后一个之外的所有匹配属性调用。这里发生了什么?
python - Python - 将`set.union`分配为类属性
当set.union
作为属性分配给一个类时,并从该类的实例变量调用此属性将引发错误:TypeError: descriptor 'union' for 'set' objects doesn't apply to 'Foo' object
. 这里有一个例子来说明这个问题:
set.union
分配为实例属性时不会发生这种情况:
是什么导致了这个错误?为什么这只发生在类属性上?
python - 在 Python 描述符中使用 setattr() 和 getattr()
在尝试以几种不同的方式创建描述符时,我注意到一些我试图理解的奇怪行为。以下是我创建描述符的三种不同方法:
然后我在类中使用它们Foo
,如下所示:
在设置FooOne
和FooTwo
获取值时按预期工作。FooThree
引发以下错误:
看起来setattr()
正在调用该__set__()
方法?但是,如果setattr()
要修改obj
__dict__
? 如果我们使用,为什么这会起作用internal_name
?
为什么我们需要使用私有变量才能正确使用内置getattr()
和setattr()
方法?另外,这与直接修改obj
__dict__
类似 in 有什么不同NumericValueOne
?
python - 有没有办法在运行时将描述符分配给实例属性?
这个问题在 2016 年被问到,但没有得到回答:可以将描述符分配给实例属性而不是类属性吗?
我有一个基本的描述符
是否可以在运行时将此描述符的实例分配给其他类实例,并使其行为符合描述符协议?
天真的方法失败了:
foo.thing
不像一个描述符,它只是像一个典型的实例属性。
这不是 XY 问题。正如我所说的那样,我特意要求回答这个问题。
python - 将描述符或属性与 classmethod 一起使用
我已经看到了很多关于这个问题的答案,他们都说不可能将属性与类方法一起使用,但以下代码有效:
为什么以及如何工作?
在 CPython 3.9.1 上运行。