在 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
我有一个 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