在类内部装饰@ property.setter装饰器

时间:2019-04-11 10:05:53

标签: python python-3.x decorator python-decorators

我找不到在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

但是我不知道如何实现这样的装饰器。

1 个答案:

答案 0 :(得分:0)

我认为描述符是您所需要的。看到这个例子:

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版本获得更好的实现。