【问题标题】:Decorate a @property.setter decorator inside a class [duplicate]在类中装饰 @property.setter 装饰器 [重复]
【发布时间】:2019-09-01 22:27:22
【问题描述】:

我找不到在 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.property.setter不是普通函数,而是描述符类的方法。描述符是一些特殊的装饰器。 2. 你现在如何使用property 似乎完全没有必要。 3. 如果您想跟踪任何属性的更改,也许您应该查看__setattr__ 方法。

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


【解决方案1】:

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

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 ClassWithSetting:

    def __init__(self, baud_rate):
        self.__class__.baud_rate = Settings('baud_rate')
        self.baud_rate = baud_rate

有关更多信息,请查看doc,因为您可以根据您的 python 版本有更好的实现。

【讨论】:

    猜你喜欢
    • 2020-08-20
    • 2011-10-04
    • 2012-02-09
    • 2011-11-20
    • 1970-01-01
    • 2014-01-14
    • 2020-01-11
    • 2012-04-28
    相关资源
    最近更新 更多