在类中装饰 @property.setter 装饰器 [重复]

Posted

技术标签:

【中文标题】在类中装饰 @property.setter 装饰器 [重复]【英文标题】:Decorate a @property.setter decorator inside a class [duplicate] 【发布时间】: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__ 方法。 【参考方案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 版本有更好的实现。

【讨论】:

以上是关于在类中装饰 @property.setter 装饰器 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Typescript 中装饰装饰器?

python中装饰器装饰类中的方法

在 MRO 中装饰顶部功能

Flask-RESTful中装饰器的使用

python中装饰器修复技术

Python中装饰器(转)