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

python - 为什么这是假的?`SomeClass.method 是 SomeClass.method`

以这段代码为例:

  • 示例 1:我会猜到它们是同一个对象。Python 是否会在每次引用该方法时复制该方法?
  • 示例 2:预期。
  • 示例 3:预期,因为它们是不同的对象。
  • 示例 4:为什么此输出与示例 2 不匹配?
0 投票
1 回答
2731 浏览

python - 以声明方式设置类 __name__

为什么不能以声明方式覆盖类名,例如使用不是有效标识符的类名?

我想也许这只是在类定义块完成后被覆盖的一种情况。但似乎这不是真的,因为名称是可写的,但显然没有在类字典中设置:

问题:

  1. 在哪里Potato.__name__解决?
  2. 如何Potato.__name__ = other处理(在类定义块的内部和外部)?
0 投票
1 回答
32 浏览

python - 测试描述符是否已经解包的有效方法是什么?

假设我们有以下类:

现在,我们通过cm以下方式获取属性:

什么是cm我们刚刚得到的测试的有效方法?
(我们无法直接访问 K 类,只有cm返回的 by geht

random.choice是非常人为的,但在某些情况下,我们有一个伪属性容器,我们想要验证它们是否都尚未解包,或者验证它们是否已解包。

一种失败的方法

人们可能会认为描述符有一个__get__()方法,而返回的对象__get__()没有。

但是,用__get__修饰的函数的方法@classmethod返回一个对象,该对象也有一个__get__方法。

包装和未包装类方法的属性

我很想我们可以测试伪属性,看看它是否有__call__方法。但是,我希望该解决方案适用于一般的描述符,而不仅仅是classmethods。d对于具有方法的类的任何属性,__get__最好确定某个引用ref是对的引用d还是返回的值d.__get__()(假设d.__get__()不返回d

0 投票
1 回答
882 浏览

python - 获取类属性的属性名

这是两个离散对象:

对于任何Field对象,是否有一种方法可以让该对象知道MyClass分配给它的属性名称?

我知道我可以将参数传递给Field对象,例如email = Field(name='email'),但在我的实际情况下这会很混乱和乏味,所以我只是想知道是否有一种非手动的方式来做同样的事情。

谢谢!

0 投票
1 回答
271 浏览

python - 如何从 __get__ 中获取描述符的属性名称?

在实现描述符时,可以使用__set_name__来注册描述符设置在哪个属性名称下。

虽然,假设我们要为同一个描述符设置多个属性,那么似乎无法知道在__get__and__set__方法中通过哪个名称访问描述符。

代码

输出

是否有一种简洁通用的方法可以知道从哪个属性访问了描述符?

0 投票
2 回答
253 浏览

python - 在类和实例上表现不同的函数

我希望一个特定的函数可以作为类方法调用,并且在实例上调用它时表现不同。

例如,如果我有一个class Thing,我想Thing.get_other_thing()工作,但也要thing = Thing(); thing.get_other_thing()表现得与众不同。

我认为get_other_thing在初始化时覆盖该方法应该可以工作(见下文),但这似乎有点 hacky。有没有更好的办法?

0 投票
0 回答
217 浏览

python - 避免 PySide2 中属性的代码重复

我厌倦了编写相同的代码来Properties声明PySide2

有什么方法可以使用 python 描述符Properties吗?像这样:

它给了我一个错误:

可能是因为它是Property类,而不是QObject我没有调用QObject的构造函数。有没有办法避免代码重复?

0 投票
1 回答
68 浏览

python - 像 dict.fromkeys 这样的内置类型的函数描述符的行为与普通方法不同

为什么函数的函数描述符dict.fromkeys与其他普通函数不同。

首先你不能__get__像这样访问:dict.fromkeys.__get__你必须从__dict__. ( dict.__dict__['fromkeys'].__get__)

然后它不像任何其他函数那样工作,因为它只会让自己绑定到一个dict.

这符合我的预期:

然而,这会发生一些意想不到的事情:

但它的描述不同于普通的未绑定函数,看起来像:<method 'fromkeys' of 'dict' objects>而不是:<unbound method dict.fromkeys>这就是我

这按预期工作:

但你不能将它绑定到我理解的其他东西上它不起作用,但这通常不会阻止我们:

这将失败,函数描述符中出现类型错误...:

为什么python会像这样区分内置类型函数和普通函数?我们也可以这样做吗?我们可以创建一个只绑定到它所属类型的函数吗?

0 投票
2 回答
484 浏览

python - 装饰方法时访问绑定方法或自身

我有一个用例,我想用另一种调用方法来装饰方法,例如在此代码中:

前三个调用按预期工作,但x.function.enhanced()没有;我必须写信x.function.enhanced(x)才能让它发挥作用。我知道这是因为func传递给装饰器的不是绑定方法而是函数,因此需要self显式传递。

但我怎样才能解决这个问题?从我对描述符的了解来看,它们仅在查找类时才相关,并且由于func不是类,func.enhanced因此无法以我可以拦截的方式查找。

有什么我可以在这里做的吗?

0 投票
0 回答
65 浏览

python - 如何在构造函数中取消类装饰器

让我们以下面的类装饰器示例(来源http://www.informit.com/articles/article.aspx?p=1309289&seqNum=4):

StockItem构造函数被调用两次,第二次我希望 @valid_string 装饰器以某种方式被取消(我不想再更改名称属性的值)。