我找不到在Python类中装饰@ property.setter装饰器的正确方法。
为了避免复制粘贴代码,我决定在项目的“设置”模块中修饰@ property.setter函数。所以“设置”模块,具有自动保存新添加/更改设置的能力。
问题是要启用自动保存功能,我必须设置一个标志:
self.changed = True
每次修改设置。
但是,我不认为在每个@ property.setter中添加该标志是个好主意,因为在执行保存之前我可能需要执行更多逻辑,在这种情况下我将不得不粘贴此我已经拥有的每个@ property.setter的逻辑(这不是高效的imo)。
我想要的是取代:
@baud_rate.setter
def baud_rate(self, value):
self.changed = True
self._baud_rate = value
有:
@setting_decorator
@baud_rate.setter
def baud_rate(self, value):
self._baud_rate = value
但我不知道如何实现这样的装饰器。
我认为描述符就是你所需要的。看这个例子:
class Settings:
def __init__(self, name):
self.name = name
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value):
instance.__dict__['changed'] = True
instance.__dict__[self.name] = value
class YourSetting:
baud_rate = Settings('baud_rate')
def __init__(self, baud_rate):
self.baud_rate = baud_rate
有关更多信息,请查看doc,因为根据您的python版本,您可以获得更好的实现。