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

python - Python如何获取一些property.setter的绑定方法

我有一堂课property。我也有该属性的设置器。我怎样才能得到绑定的方法property.setter


为什么我要问

使用常规方法,这很容易。一个可以用class_instance.method_name

但是,我很难弄清楚这一点property,因为它返回一个描述符对象。


示例代码

这是写的Python 3.6

0 投票
1 回答
122 浏览

python - 具有描述符的类如何使用描述符的方法解析其实例属性?

我很困惑为什么在实例实例化之后检索或在实例构造期间设置的实例属性是通过描述符完成的。

例如,假设我们有以下描述符和类。

描述符

班级

现在我们创建一个 Planet 实例并检索它的质量。

我不知道为什么Positive.__get__要调用它,因为它是一个类属性。有人可以解释一下吗?更令人困惑的是如何Positive.__set__拦截构造函数参数的直接赋值mass_kilograms

谢谢!

0 投票
1 回答
65 浏览

python - Python对象代理问题:描述符和@staticmethod

我正在尝试创建一个代理(包装器)对象,以便我可以修改已实例化对象的行为。包装类的type属性与底层对象的属性一起设置为新生成的类(使用),这样做是因为 Python __magic __ 方法只有在它们是类的成员时才能正常工作。cls包装类也是如此client,底层对象也是如此:

问题来自包装类中的@staticmethod/ @classmethod。我不能从实例调用静态方法,因为self正在传递给它。我尝试使用__get__但没有成功。这是一个失败的最小示例:

0 投票
2 回答
131 浏览

python - 为什么这个类描述符__get__方法返回self?

我正在阅读O Reilley Python Cookbook,我对以下代码有疑问:

我对这部分感到困惑:

如果未设置实例(即无),那么它说返回“自我”,因为自我表示类描述符,究竟返回什么?

0 投票
1 回答
676 浏览

python - 知道是否已经访问了 python 缓存的属性而不实际访问它

有很多方法装饰器的例子可以将方法转换为缓存的属性。但有时,我想检查缓存是否“活动”,这意味着该属性已被访问并且缓存已被填充。

例如,如果我使用rows缓存将 sql 表存储在 a 中rows,我想根据缓存计算我的表的长度,如果它已被填充,但如果没有,则通过单独的 sql 调用。如何在rows不触发其访问的情况下检查是否已被访问?

这是一个很好的装饰器,取自 David Beazley 的“Python Cookbook”)我正在使用它来满足我的缓存属性需求。我已经对其进行了增强以启用我当前的 hack。

使用示例:

所以hasattr实际上触发了len方法调用,所以我不能使用它。无论如何,我不想使用它,因为我不是要求存在属性(键/引用),而是要求存在(即事先计算)它的值。

鉴于标有“我的黑客”的行,我现在可以这样做:

但我相信还有比这更优雅的解决方案。也许会与lazyprop自身“耦合”...

0 投票
1 回答
133 浏览

python - 类装饰器不绑定自我

我已经定义了一个类,该类将装饰器定义为该类的方法。装饰器本身会创建第二个类的可调用实例,以替换被装饰的方法。由于装饰方法现在实际上是一个类,我可以在它上面调用方法。在我的(虚构的,最小的)示例中,我想使用每个方法的自定义最大回调数来注册回调。

函数的一切都按预期工作,但是当我装饰一个类方法时它会中断,因为类实例未绑定到装饰方法:

现在,如果我定义一个接受回调的方法:

如果我明确地传递 self ,它会起作用,但如果我只是假设实例已绑定,则不会:

这是回溯:

I always though that t.foo(i=5) is basically syntactic sugar for Test.foo(t, i=5) via descriptors, but it seems I am wrong. So here are my questions:

  1. What is the reason that this does not work as expected?
  2. What do I have to do to make it work?

Thank you!

PS: I am using python 3.8

0 投票
0 回答
17 浏览

python - 为什么非覆盖描述符被隐藏但覆盖描述符没有?

为什么__set__当存在同名的实例属性时,未实现的描述符会被 Python 中的实例属性所掩盖,而对于确实实现的描述符则不然__set__

毕竟,两种类型的描述符都有一个,所以在检索值时__get__不应该使用它吗?__get__

作为问题的一个例子,假设我们有以下 shell 会话。

为什么不是最后一行

反而?这对我来说似乎是一个矛盾。

0 投票
1 回答
23 浏览

python - 描述符装饰器究竟是如何被调用的?

给定以下模拟静态方法的代码:

当我打电话时: A.func2 我得到了我的期望:

当我打电话时:A.func2()我得到:

这是否意味着每当您调用 Descriptor Decorator 方法时,Python 首先会从 Descriptor 的__get__方法中检索它?

如果是,那么该方法实际上是如何被调用的?引擎盖下到底发生了什么?

0 投票
1 回答
46 浏览

python - 装饰类以在调用 __get__() 时运行一段代码

请看下面的代码

我想运行一些代码,例如每当student1.get_student_id()或被student1.get_student_name()调用时(或在访问get () 时将学生添加到数据库中。如果我使用了错误的描述符,请纠正我)。我必须通过装饰器来做到这一点,只适用于下面的多个类

使用装饰器如何实现这一点?我需要对可以有任何方法的多个类使用单个装饰器。每当调用任何类的任何方法(除了以 _ 或 __ 开头的方法)时,装饰器都应将数据保存到 DB

0 投票
0 回答
21 浏览

python - 如何使装饰器/描述符托管属性接受可迭代以消除代码重复?

下面的代码来自这个repo。它随附在 Python 3 编程:Python 语言的完整介绍(开发人员库)一书中。

这部分代码展示了使用装饰器valid_number来强制minimum和的maximum值。pricequantityStockItem

就我而言,我有一个具有两个具有相同约束的属性的类,所以装饰器看起来像:

我希望能够写出类似...

将约束应用于这两个属性。我仍在研究装饰器和描述符的所有细微差别,所以我不知道这是否可能。描述符和装饰器的完整实现在repo中。