gpt4 book ai didi

python - 如何获取Python中通过@property创建的getter/setter方法的引用?

转载 作者:行者123 更新时间:2023-12-01 04:14:32 24 4
gpt4 key购买 nike

我想将一些 QWidget 绑定(bind)到 Python 3 中现有类的属性,以便通过 GUI 所做的任何更改都以干净简单的方式应用于底层数据对象。

我现有的类(class)如下所示(简化):

class Player:

def __init__(self):
self._health = 100

@property
def health(self):
return self._health

@health.setter
def health(self, value):
self._health = value

PyQt5允许将Qt信号连接到任何方法,因此我可以通过调用someWidget.valueChanged.connect(player.someSetterMethod)轻松实现我的目标。

但是,我使用@property,因此,setter 名称与属性名称相同。当我尝试使用 player.health 时,它被解释为一个整数(如预期,但显然不是我想要的)。

我知道我可以使用自定义名称定义 getter/setter 方法,然后使用 property() 而不是 @property,但我希望有一种方法获取对 setter 方法的引用,以便我可以将其传递给 connect()

谢谢!

编辑:我怀疑它与这个问题相关,但也许我应该补充一点,在下一步中,我想报告未应用到 GUI 的更改。

最佳答案

您必须使用 lambda,因为您需要绑定(bind)属性来获取正确的上下文:

someWidget.valueChanged.connect(lambda v: setattr(player, 'health', v))

属性对象确实具有 .fget.fset 属性,并且可以在类上访问属性对象本身:

Player.health.fset
Player.health.fget

但是这些可以让您访问原始的未绑定(bind)函数对象,这些对象仍然需要self参数。

您也可以使用这些函数,但是您必须首先将它们绑定(bind)到您的实例:

someWidget.valueChanged.connect(Player.health.fset.__get__(player))

__get__ method在函数(即 descriptor )上为您提供一个绑定(bind)方法,该方法为您传递 self 参数(在本例中为 player 实例对象)。

关于python - 如何获取Python中通过@property创建的getter/setter方法的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34463966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com