问题标签 [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 - 删除器中的事件链
假设我有以下类,其中既有deleter
属性的客户,也有实例本身:
并称之为:
看起来它首先调用__delattr__
on is_open
,然后调用@is_open.deleter
,然后调用__delattr__
on _is_open
。为什么删除者的事件链会这样工作?
python - 为什么在类上设置描述符会覆盖描述符?
简单的复制:
这个问题有一个有效的重复,但没有回答重复,我在 CPython 源代码中挖掘了更多作为学习练习。警告:我进入了杂草。我真的希望我能从熟悉这些水域的船长那里得到帮助。为了我自己未来的利益和未来读者的利益,我试图尽可能明确地追踪我正在查看的电话。
我已经看到很多墨水溢出了__getattribute__
应用于描述符的行为,例如查找优先级。下面“调用描述符”中的 Python 片段在For classes, the machinery is in type.__getattribute__()...
我看来与我认为对应的CPython 源代码大致一致,我type_getattro
通过查看“tp_slots”然后填充 tp_getattro 的位置来追踪它。B.v
最初打印的事实__get__, obj=None, objtype=<class '__main__.B'>
对我来说很有意义。
我不明白的是,为什么分配会B.v = 3
盲目地覆盖描述符,而不是触发v.__set__
?我试图跟踪 CPython 调用,再次从"tp_slots"开始,然后查看tp_setattro 的填充位置,然后查看type_setattro。 type_setattro
似乎是_PyObject_GenericSetAttrWithDict周围的薄包装。这就是我困惑的症结所在: _PyObject_GenericSetAttrWithDict
似乎有逻辑优先于描述符的__set__
方法!考虑到这一点,我无法弄清楚为什么B.v = 3
盲目覆盖v
而不是触发v.__set__
.
免责声明 1:我没有使用 printfs 从源代码重建 Python,所以我不完全确定type_setattro
在B.v = 3
.
免责声明 2: VocalDescriptor
并非旨在举例说明“典型”或“推荐”描述符定义。告诉我何时调用方法是一个冗长的无操作。
python - Python 描述符
从描述符文档:
描述符可以通过其方法名直接调用。例如,
d.__get__(obj)
。
下面这个类的例子是什么?
例如,什么是d
和什么是obj
?"d.__get__(obj)"
上面的类/实例将如何调用?
python - 制作只读描述符
我制作了一个基本的只读描述符:
它适用于一个基本示例:
有没有办法使上述更通用?例如,而不是必须调用它obj._something
来__get__
动态调用它?换句话说(除了使用装饰器),执行上述操作的更通用方法是什么?
python - 静态方法如何不绑定到“静态方法”类?
我试图了解描述符如何在 python 中工作。我得到了大局,但我在理解 @staticmethod 装饰器时遇到了问题。
我具体指的代码来自相应的python doc:https ://docs.python.org/3/howto/descriptor.html
我的问题是:当self.f
在最后一行访问时,它本身不会f
被识别为描述符(因为每个函数都是非数据描述符),因此会绑定到 self,它是一个 StaticMethod 对象?
python - 使用类名在 Python 中设置描述符属性的值
我试图了解描述符在 Python 中是如何工作的。我有以下代码片段。
name
当使用类名访问描述符属性时,即Person.name
调用 get 方法。但是,当我尝试使用相同的方式设置值时,即Person.name = 'Jack'
不调用 set。在这里,我期待设置被调用。
我无法理解这种行为。
我正在使用 Python 3.8。
python - 如何将实例绑定描述符作为引用参数传递给函数?
如果没有直接的解决方案,这可能有点棘手,但我也会对更复杂的解决方案感到满意:
我有一个实例绑定数据描述符绑定到我想作为函数参数传递而不被评估(即__get__()
执行)的全局实例。在此代码示例中,它不起作用,并且描述符将10
类型的当前值传递int
给函数参数,而不是其自身:
输出是:
我明白它不是这样工作的。但我想要的是my_instance.__dict__['x_value']
在函数内部操作全局实例字典值。我必须对许多实例和函数重复这一点,并且实际的描述符也在做其他事情(在这个例子中,它只打印“我是......”但在我的例子中,它是例如类型检查、触发其他进程等),所以不希望直接进行字典操作。它必须由描述符完成。
问题
我可以构建某种描述符,可以将一种引用传递给行为等效的函数参数吗?
至今
我一直在寻找不同的选择:
- 单独传递
my_instance
和字符串名称x
或作为元组并在函数内部使用getattr()
,setattr()
。我不喜欢它,因为它是一个框架,对任何人都不好。 - 重载描述符,让它检测它是否通过例如
inspect
someAST
-package 传递给函数,然后在重载的内部构建适当的引用__get__()
并返回它。我可以管理检测部分,但我不知道参考的外观如何?将其包装在另一个描述符中?
最后,函数参数应该像直接可调用的描述符一样在函数内部工作,但获取/设置全局字典my_instance.__dict__['x_value']
(并执行提到的所有其他内容)。
我很高兴有任何想法并期待讨论!
python - 为什么一个对象的“__dict__”不能存储在它的__dict__中?
在这个答案中提到实例的"__dict__"
属性不能直接存储在其__dict__
. 为什么?
此外:如果instance.__dict__
转换为type(instance).__dict__["__dict__"].__get__(instance)
,这是否意味着也instance.x
转换type(instance).__dict__["__dict__"].__get__(instance)["x"]
为?
顺便说一句:我已经阅读了官方描述符文档,但这仍然让我感到困惑。
谢谢!
python - 为什么使用描述符可以引入 __slots__?
在“Python 的历史”系列的这篇博文中,Guido van Rossum 指出:
描述符的另一个增强功能是在类中引入了 __slots__ 属性。
我将这句话理解为:在引擎盖下 __slots__ 是由描述符实现的。
但与我的解释相反,Guido van Rossum 后来写了几行:
在幕后,此功能的实现完全在 C 中完成,并且非常高效。
那么,__slots__ 不是由描述符实现的吗?
但两句话之后,他又写道:
__slots__ 不仅是描述符的有趣应用,...
那么,__slots__ 和描述符的实际情况是什么?
__slots__ 是否由描述符实现?如果是的话:如何?
python - Python如何获取用property.setter包装的方法的__qualname__
我有一个实例属性,我使用 Python 的property
装饰器创建了一个属性。
然后,我使用 decorator 为该属性创建了一个设置器@property_name.setter
。
我怎样才能得到__qualname__
原始方法定义的,用 装饰@property.setter
?
我看过的地方
- Python:带有装饰器的函数的 __qualname__
- 我不认为
property
用途@functools.wraps()
- 我不认为
- Python @property.setter
- 我意识到
property
实际上是一个descriptor
- 我意识到
- 在@property 之后修饰一个类方法
- 告诉我我可能想使用
__get__
,但我无法弄清楚语法
- 告诉我我可能想使用
示例代码
这是写在Python 3.6
.
输出:
如何从装饰器内部获取__qualname__
for ?换句话说,我如何才能被输出?some_attr
print_qualname
SomeClass.some_attr