问题标签 [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 回答
30 浏览

python - 语言参考中描述的python函数的描述符协议在哪里?

我偶然发现了这个在 Python 中将绑定方法动态分配给类实例的好技巧:

我想知道的是参考中指定了这种行为的位置。这是我找到的最接近的:

佩普 590

描述符操作指南

我想知道这种行为是否实际上在某处的语言参考中指定。这似乎是一个足够重要的用例,可以由文档来保证(即不清楚出现在HowTo中的内容是否演示了保证的语言特性或使用了实现细节,我想原则上认为,所有保证的功能都可以从规范中推断出来,而无需参考PEP)。

0 投票
2 回答
400 浏览

python - Python __set_name__ 中的异常行为

我有一个使用 Python 3.6+ 的子类,__set_name__以确保拥有的类已经注释了携带子类的字段的类型。如果他们没有引发异常。

但是,任何引发的异常总是被 Python 捕获并被RuntimeError引发。

例如:

结果是:

这很可能是预期的行为(找不到对__set_name__异常的特定引用),但也可能表明期望__set_name__永远不会遭受异常。

我看到的行为不是问题,因为在正确的条件下会发生异常。但是,由于我不能确定引发的异常是我的代码引发的异常,因此测试起来很棘手。

有没有更好的方法来引发一个适合测试的异常,或者确实有一种简单的方法来检查由 包裹的异常RuntimeError确实是我的代码引发的异常?

0 投票
1 回答
27 浏览

python - 类本地函数中的访问描述符

我想知道如何在不同的函数中访问描述符?当我初始化 Vehicle 类时,我可以将速度初始化为描述符,但是我无法在 Vehicle 函数 (calc_speed()-> self.speed.value) 中访问它的值返回AttributeError: 'int' object has no attribute 'value'。此外,不应该更改值audi.speed = 120触发set功能(以及打印应该触发get功能)?

我的期望

0 投票
1 回答
37 浏览

python - 为什么 object.__setattr__.__get__(self, Attribute) 在 attrs/_make.py 中用于 Attribute 的 __init__

我喜欢使用attr并决定阅读一些源代码。引起我注意的一部分是以下(来源):

其中_obj_setattr定义为object.__setattr__

我很好奇为什么会这样做。我已经阅读了这个stackoverflow 响应,发现它非常有用,但它没有涵盖关于__get__. 我已经阅读了一些内容,descriptors但还没有完全理解它们。所以,我的问题是,为什么使用_obj_setattr.__get__(self, A)("name", name), 而不是object.__setattr__(self, "name", name)?

0 投票
1 回答
38 浏览

python - 如何在初始化时读取变量的名称并将其存储在 python 中的描述符类中?

我的计划是这样的:使用 python 描述符,我想在赋值时读取变量的名称。当前代码:

我使用描述符的原因是在编译时实现静态类型并为字段分配和声明提供一个包装器。如果我要在课堂上实现它......

目标:如何在没有直接引用的情况下将变量 num 的名称作为字符串并将其分配给 Descriptor 类中的字段,例如self.name?因此,当我更改类的不同实例中的值时,我可以只写instance.__dict__[self.name] = constant?

0 投票
1 回答
68 浏览

python - 如何在属性获取时使用添加描述符来捕获和引发 TypeError?

在不对类进行更改的情况下,实现一个描述符,该描述符检查获取到实例属性的值是否具有正确的类型。

我找到了一个相关的帖子,但我不知道如何在我的情况下实现它。 了解 __get__ 和 __set__ 以及 Python 描述符

像这样:

0 投票
2 回答
66 浏览

python - Python:从列表中动态生成属性

我希望能够从列表或字典中动态生成类的属性。这个想法是我可以定义一个属性列表,然后能够使用访问这些属性my_class.my_attribute

例如:

这显然行不通,因为cls不存在,但我想:

返回 的campaign_typecampaign。这显然有点复杂,因为campaign_type实际上是 a并且做了一些工作来从基础对象Descriptor中检索一个值。Label


描述符:

这使我可以轻松访问标签的值,如果标签是我关心的类型,它将返回相关值,否则将返回False.


标签对象:

因此,如果我的标签(基本上只是一个包装器)中存储了一个 protobuf 标签对象,它看起来像这样:

然后my_label.campaign_type会返回Primary,同样my_label.match_type会返回False


原因是我正在创建许多以相同方式标记的类,并且可能有很多标签。目前这一切都按描述工作,但我希望能够更动态地定义属性,因为它们基本上都遵循相同类型的模式。所以而不是:

我只是有: _LABELS = ['campaign_type', 'match_type', 'audience_type', ... many more labels]然后有一些循环来创建属性。

反过来,我可以将类似的方法级联到我的其他类,这样虽然一个Campaign对象可能包含一个Label对象,但我可以通过简单地访问标签的值my_campaign.campaign_type。如果活动没有适当类型的标签,它将简单地返回False

0 投票
2 回答
294 浏览

python - 如何在python中向描述符或属性添加方法

我正在尝试编写一个可以轻松扩展的模拟类。为此,我想使用类似于属性的东西,但这也提供了update一种可以针对不同用例以不同方式实现的方法:

默认模拟可以这样使用:

我想以这样的方式编写它,以便可以以任何用户定义的方式扩展模拟,例如添加另一个以不同方式更新的数量:

这有可能以某种方式还是有其他方法可以实现类似的行为?我已经看到了这个问题,这可能会有所帮助,但答案似乎很不优雅——我的案例有没有好的面向对象的方法?

0 投票
1 回答
279 浏览

python - 如何解决 Python 中的属性错误?

我正在学习python中的描述符。我正在尝试代码,但得到下面提到的属性错误。

AttributeError:“celciusDescriptor”对象没有属性“_celciusDescriptor__fahrenheit”

我试图通过获取华氏温度来获得输出为(32,0),即(华氏,摄氏度)。

'''

'''

0 投票
1 回答
69 浏览

python - 在 Python 3.6+ 中实现描述符的正确方法是什么?

在YouTube 上的Raymond Hettingers心理游戏中:

Daw-Ran Liou 在用 Python 3.6+ 编写描述符中指出:

[...] 我们需要直接访问dict对象,而不是使用内置函数 getattr 和 setattr,因为内置函数也会被描述符协议拦截并导致 RecursionError。

但 Matthew Egans在 YouTube 上描述描述符时说:

实现描述符的正确方法是什么?