问题标签 [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 - 为什么这是假的?`SomeClass.method 是 SomeClass.method`
以这段代码为例:
- 示例 1:我会猜到它们是同一个对象。Python 是否会在每次引用该方法时复制该方法?
- 示例 2:预期。
- 示例 3:预期,因为它们是不同的对象。
- 示例 4:为什么此输出与示例 2 不匹配?
python - 以声明方式设置类 __name__
为什么不能以声明方式覆盖类名,例如使用不是有效标识符的类名?
我想也许这只是在类定义块完成后被覆盖的一种情况。但似乎这不是真的,因为名称是可写的,但显然没有在类字典中设置:
问题:
- 在哪里
Potato.__name__
解决? - 如何
Potato.__name__ = other
处理(在类定义块的内部和外部)?
python - 测试描述符是否已经解包的有效方法是什么?
假设我们有以下类:
现在,我们通过cm
以下方式获取属性:
什么是cm
我们刚刚得到的测试的有效方法?
(我们无法直接访问 K 类,只有cm
返回的 by geht
)
这random.choice
是非常人为的,但在某些情况下,我们有一个伪属性容器,我们想要验证它们是否都尚未解包,或者验证它们是否已解包。
人们可能会认为描述符有一个__get__()
方法,而返回的对象__get__()
没有。
但是,用__get__
修饰的函数的方法@classmethod
返回一个对象,该对象也有一个__get__
方法。
我很想我们可以测试伪属性,看看它是否有__call__
方法。但是,我希望该解决方案适用于一般的描述符,而不仅仅是classmethod
s。d
对于具有方法的类的任何属性,__get__
最好确定某个引用ref
是对的引用d
还是返回的值d.__get__()
(假设d.__get__()
不返回d
)
python - 获取类属性的属性名
这是两个离散对象:
对于任何Field
对象,是否有一种方法可以让该对象知道MyClass
分配给它的属性名称?
我知道我可以将参数传递给Field
对象,例如email = Field(name='email')
,但在我的实际情况下这会很混乱和乏味,所以我只是想知道是否有一种非手动的方式来做同样的事情。
谢谢!
python - 如何从 __get__ 中获取描述符的属性名称?
在实现描述符时,可以使用__set_name__
来注册描述符设置在哪个属性名称下。
虽然,假设我们要为同一个描述符设置多个属性,那么似乎无法知道在__get__
and__set__
方法中通过哪个名称访问描述符。
代码
输出
是否有一种简洁通用的方法可以知道从哪个属性访问了描述符?
python - 在类和实例上表现不同的函数
我希望一个特定的函数可以作为类方法调用,并且在实例上调用它时表现不同。
例如,如果我有一个class Thing
,我想Thing.get_other_thing()
工作,但也要thing = Thing(); thing.get_other_thing()
表现得与众不同。
我认为get_other_thing
在初始化时覆盖该方法应该可以工作(见下文),但这似乎有点 hacky。有没有更好的办法?
python - 避免 PySide2 中属性的代码重复
我厌倦了编写相同的代码来Properties
声明PySide2
:
有什么方法可以使用 python 描述符Properties
吗?像这样:
它给了我一个错误:
可能是因为它是Property
类,而不是QObject
我没有调用QObject
的构造函数。有没有办法避免代码重复?
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会像这样区分内置类型函数和普通函数?我们也可以这样做吗?我们可以创建一个只绑定到它所属类型的函数吗?
python - 装饰方法时访问绑定方法或自身
我有一个用例,我想用另一种调用方法来装饰方法,例如在此代码中:
前三个调用按预期工作,但x.function.enhanced()
没有;我必须写信x.function.enhanced(x)
才能让它发挥作用。我知道这是因为func
传递给装饰器的不是绑定方法而是函数,因此需要self
显式传递。
但我怎样才能解决这个问题?从我对描述符的了解来看,它们仅在查找类时才相关,并且由于func
不是类,func.enhanced
因此无法以我可以拦截的方式查找。
有什么我可以在这里做的吗?
python - 如何在构造函数中取消类装饰器
让我们以下面的类装饰器示例(来源http://www.informit.com/articles/article.aspx?p=1309289&seqNum=4):
类StockItem
构造函数被调用两次,第二次我希望 @valid_string 装饰器以某种方式被取消(我不想再更改名称属性的值)。