问题标签 [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 投票
1 回答
275 浏览

python - Python中的自适应描述符

我想在返回代理对象的类上创建某种描述符。代理对象在被索引时检索对象的成员并将索引应用于它们。然后它返回总和。

例如,

当我将实际数组作为成员变量时,此解决方案运行良好:

现在我已将数组更改为 Python 描述符(cluster_signal实现返回 numpy 数组的描述符协议):

这不起作用,因为 append 语句附加了描述符调用的结果。我需要的是附加绑定方法或类似的代理。修改我的解决方案的最佳方法是什么?简而言之:变量basic_inexplanation_innumpy数组。它们现在是描述符。我想开发一些ArraySumProxy与描述符一起使用的版本,而不是需要实际的数组。

0 投票
2 回答
444 浏览

python - 受 `namedtuple` 启发,改进我的 `namedlist` 类

背景

我需要一个类似于 的类型namedtuple,但具有可变字段。namedlist应该表现如下:

在了解了一些关于这里那里的描述符之后,我得到了以下代码,如上所述:

问题

IndexAccessor门课对我来说有点像样板,所以我想知道是否可以改进代码以避免它。

我试图for index, field in enumerate(fields)用这个替换循环

...但这导致该print a, b, st.a, st.b语句生成123 456 456 456而不是123 456 123 456,我怀疑这与index未按要求工作有关。

答案的奖励积分还可以提供简洁的代码以允许在构造函数中进行基于名称的分配,如

0 投票
1 回答
464 浏览

python - 使用附加参数调用 python 描述符的 __get__?

获取描述符时是否可以传递其他参数?

例如,我想要:

然后可以像这样使用它:

然后得到:

有什么办法可以使这项工作?我什至尝试调用elem1.__get__(self, self.__class__, extra_text='extra)并制作extra_text所需的参数,但无法找到任何实际提供它的方法?

如果没有描述符,是否有另一种方法来实现这种语法?

谢谢!

0 投票
1 回答
176 浏览

python - D 像 Python 描述符这样的元编程?

我正在尝试将我的框架的一部分从 Python 转换为 D,并且正在努力解决一个细节:但首先我必须扩大范围。该组件就像一个 ORM。我的用户定义类,哪些实例将在数据库中持久存在。用户 API 应该尽可能简单。例如

加载函数从数据库加载实例数据。但是车主的加载应该推迟到实例被使用,因为大多数应用程序都工作在汽车上,车主很少使用。

在 Python 中,我可以使用Descriptor-Protocol来实现这种行为。我有一组“字段”类,它们是描述符。例如

EntityClass 有一个适当的元类,它连接所需的连接。用户在 Python 中定义:

并使用类:

在引擎盖下,对 myCar.power 的调用扩展到

如果我从数据库加载汽车,我只加载所有者 ID。如果一个使用所有者

我可以从数据库中加载延迟的 Person 实例

将 ORM 转换为 DI 尝试了不同的实现。对于简单的基本类型,将用户定义的属性 (UDA) 与模板和统一调用语法结合使用非常简单:

这个 API 和 Python-API 一样简单,但是我不知道如何实现 owner 的延迟加载。我需要的是用属性函数替换所有者成员,但我不知道如何使用编译时元编程来做到这一点。那么这要怎么做呢?还是有惯用的方法?

0 投票
2 回答
149 浏览

python - 反映字符串属性中的 Python 列表更改

我正在寻找一种优雅(有效)的方式来实现以下内容:

我有一个类将值列表存储为字符串(带有分隔符,例如:“ - ”)。我使用一个属性(getter 和 setter)将此字符串转换为 Python list

获取/设置属性没问题:

但我正在寻找一些东西(可能是另一种列表)来自动反映list.

目前,我使用回调系统实现自己的list类继承。collections.MutableSequence有没有更好的方法来做到这一点?

编辑:我目前的解决方案

我使用带有“on_change”处理程序的列表,如下所示:

然后我需要修改我的C类来实现这个处理程序来反映这些变化。

该课程的新版本是:

这样,列表中的任何更改都会反映在values属性中:

0 投票
5 回答
932 浏览

python - 如何临时分配成员变量?

我经常发现我需要临时分配一些成员变量,例如

但我希望我能简单地写

甚至

Python 的装饰器或其他语言特性可以启用这种模式吗?(我可以c根据需要修改类)

0 投票
1 回答
106 浏览

python - 试图在 clang\cindex.py 中掌握 CachedPropery

这与我遇到的其他问题有关,没有答案......我试图了解Python 绑定libclang的幕后发生的事情,并且很难做到这一点。

我已经阅读了大量关于PythondecoratorsdescriptorsPython 的文章,以了解clang/cindex.py 中的 CachedProperty 类是如何工作的,但仍然无法将所有部分放在一起。

我见过的最相关的文本是一个 SO answer和 ActiveState 中的这个代码配方。这对我有点帮助,但是——正如我所提到的——我仍然不在那里。

所以,让我们切入正题:我想了解我为什么要AssertionError创建 CIndex。我将只在这里发布相关代码(cindex.py 是 3646 行长..),我希望我不会错过任何与我相关的内容。我的代码只有一个相关行,即:

这指的是 cindex.py 中的第 2291 行,它产生:

从现在开始,有一系列的函数调用,我无法解释为什么它们来自于 WTH。我将列出与pdb每个部分相关的问题的代码和输出:

(需要注意的重要一点:conf.lib 定义如下:)

缓存属性代码:

Pdb输出:

  1. 为什么之后的下一个调用 Index(conf.lib.clang_createIndex(excludeDecls, 0))是 to CachedProperty.__get__方法?呢__init__
  2. 如果__init__方法没有被调用,那 self.wrapped 怎么会有价值呢?

Pdb输出:

  1. CachedProperty.__get__应该将值返回到哪里?方法的调用CDLL.__getattr__来自哪里?

对我来说最关键的部分

这是Index 继承自的类的创建。ClangObject

  1. 但是 - 哪里有__init__一个参数调用?这是那个conf.lib.clang_createIndex(excludeDecls, 0)回来的吗?
  2. 这个号码(40998256)来自哪里?我一遍又一遍地得到相同的数字。据我了解,它应该只是一个数字,但这clang.cindex.LP_c_void_p object就是断言失败的原因。

总而言之,对我来说最好的方法是逐步指导这里的函数调用,因为我对这一切感到有点迷失......

0 投票
1 回答
1447 浏览

python - 编写非数据描述符

我正在学习python中的描述符。我想写一个非数据描述符,但是__get__当我调用类方法时,以描述符作为其类方法的类不会调用特殊方法。这是我的例子(没有__set__):

这就是我所说的:

描述__get__符类的 没有调用。但是当我也设置一个__set__描述符似乎被激活:

现在我创建一个C实例:

并且两者__get__, __set__都存在。似乎我缺少一些关于描述符以及如何使用它们的基本概念。谁能解释这种行为__get__, __set__

0 投票
3 回答
125 浏览

python - 每次调用一个键时,如何从字典中返回一个随机数?

我正在尝试制造一种提供随机伤害的武器。我这样做是使用表单中的项目数据库

每次我尝试调用"damage"它时都会返回相同的结果。我知道这是因为随机数生成一个然后保存到该字典键。

每次调用损坏时,我将如何生成一个随机数?

0 投票
1 回答
498 浏览

python - 带有 __set__ 但没有 __get__ 的描述符如何工作?

我在某处读到了这样一个事实,即你可以有一个带有__set__和不带有__get__.

它是如何工作的?

它算作数据描述符吗?它是非数据描述符吗?

这是一个代码示例: