问题标签 [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.

0 投票
0 回答
63 浏览

python - 如何观察 Python 中的属性查找链?

我正在尝试深入研究 Python 的类描述符,并且遇到了一篇解释类属性查找链的文章。也就是说第一优先是__get__数据描述符的方法(即实现__set__or__delete__方法的类。然后是对象的dict ,然后是非数据描述符的get方法。

这对我来说似乎非常令人困惑,我无法找到一个真实的例子来展示数据描述符如何在实例的dict查找之前出现。我真的很感激一个用prints 说明这个理论东西的最小例子。

0 投票
1 回答
127 浏览

python - “__get__”参数之一是多余的吗?

如此处所述:

https://docs.python.org/3/reference/datamodel.html#object.__get__

传递给 __get__ 方法的两个参数(不包括“self”)分别是对象和访问属性的类。第二个参数不是多余的吗?此外,当“类”也是对象时,为什么需要区分对象和类访问?

所以,在我看来,有两种可能性:

  • 从对象访问属性,在这种情况下,所有者参数将等于type( instance ),因此它不会带来新信息
  • 属性从一个类(“类型”的对象)中访问,在这种情况下,源对象只是位于所有者参数中,实例None

在我看来,如果只使用一个参数(例如instance),则可以实现相同的功能,该参数将始终保存原始对象,无论它是否是“类”。如果确实需要该信息,则可以使用isinstance(instance, type).

那么,为什么需要这两个参数呢?

0 投票
1 回答
138 浏览

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"

0 投票
0 回答
129 浏览

python-3.x - Python 3 触发隐式值更改的回调

callback每当对象的某个属性发生更改时,我都希望调用一个A

我知道这个问题与 Python 中的观察者模式和描述符有关。但是,描述符似乎只能通过点访问来检测显式更改。

例如:

在上面的代码中,回调只被调用一次来初始化data. 但是,我希望它被调用 3 次。我不依赖于使用描述符,但我确实希望该方法适用于任何数据类型,例如listdict等等。

0 投票
2 回答
47 浏览

python - 为什么在 hassattr() 中调用 Python 中描述符的 __get__ 方法?

认为

然后在调用期间hasattr(c,"d1")调用__get__方法C.d1。为什么?不应该hasattr()只查字典吗?

<tab>在交互式 CPython-version-3.6.10 会话中按下完成时会发生相同(但更奇怪) ,如c.d<tab>. 在这种情况下__get__,将为除最后一个之外的所有匹配属性调用。这里发生了什么?

0 投票
1 回答
301 浏览

python - 打字:如何将所有者类绑定到通用描述符?

我可以在 Python 中以支持/尊重/理解其所有者的继承层次结构的方式实现通用描述符吗?

在代码中应该更清楚:

gist - gist 上几乎相同的代码片段

0 投票
0 回答
58 浏览

python - Python - 将`set.union`分配为类属性

set.union作为属性分配给一个类时,并从该类的实例变量调用此属性将引发错误:TypeError: descriptor 'union' for 'set' objects doesn't apply to 'Foo' object. 这里有一个例子来说明这个问题:

set.union分配为实例属性时不会发生这种情况:

是什么导致了这个错误?为什么这只发生在类属性上?

0 投票
1 回答
197 浏览

python - 在 Python 描述符中使用 setattr() 和 getattr()

在尝试以几种不同的方式创建描述符时,我注意到一些我试图理解的奇怪行为。以下是我创建描述符的三种不同方法:

然后我在类中使用它们Foo,如下所示:

在设置FooOneFooTwo获取值时按预期工作。FooThree引发以下错误:

看起来setattr()正在调用该__set__()方法?但是,如果setattr()要修改obj __dict__? 如果我们使用,为什么这会起作用internal_name

为什么我们需要使用私有变量才能正确使用内置getattr()setattr()方法?另外,这与直接修改obj __dict__类似 in 有什么不同NumericValueOne

0 投票
1 回答
45 浏览

python - 有没有办法在运行时将描述符分配给实例属性?

这个问题在 2016 年被问到,但没有得到回答:可以将描述符分配给实例属性而不是类属性吗?

我有一个基本的描述符

是否可以在运行时将此描述符的实例分配给其他类实例,并使其行为符合描述符协议?

天真的方法失败了:

foo.thing不像一个描述符,它只是像一个典型的实例属性。

这不是 XY 问题。正如我所说的那样,我特意要求回答这个问题。

0 投票
1 回答
392 浏览

python - 将描述符或属性与 classmethod 一起使用

我已经看到了很多关于这个问题的答案,他们都说不可能将属性与类方法一起使用,但以下代码有效:

为什么以及如何工作?

在 CPython 3.9.1 上运行。