在 lambda 中调用 属性 setter

Calling property setter within lambda

我有一个 class,它使用 属性 装饰器作为变量的 setter/getter。

class Application:

    @property
    def volume(self):
        return self._volume

    @volume.setter
    def volume(self, value):
        self._volume = value

我希望能够在 lambda 中设置应用程序的音量。

Lambda 不允许 for 语句,只允许表达式,所以不像调用 lambda application, value: application.volume = value.

那样简单
# Things I have tried and have not worked
lambda application, value: application.volume = value    # Can't assign values in lambda
lambda application, value: application.volume(value)     # Getter is run and turned into a callable
lambda application, value: (application.volume := value) # Assignment expression can not resolve application

我能做的就是改变定义 属性

的方式
class Application:

    def get_volume(self):
        return self._volume

    def set_volume(self, value):
        self._volume = value

    volume = property(get_volume, set_volume)

然后允许我直接调用 setter 函数

lambda application, value: application.set_volume(value)

虽然这个解决方案忽略了属性点。有没有办法在 lambda 中调用 setter 同时仍然使用 属性 装饰器标签,或者 hack-y 忽略 属性 并直接使用 setter设置值的最佳方式。

使用setattr:

class Application:

    @property
    def volume(self):
        print(f"volume get")
        return self._volume

    @volume.setter
    def volume(self, value):
        print(f"volume set {value}")
        self._volume = value

update_volume = lambda application, value: setattr(application, "volume", value)
x = Application()
update_volume(x, 5)
print(x.volume)

打印:

volume set 5
volume get
5