在类中装饰 @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 装饰器 [重复]的主要内容,如果未能解决你的问题,请参考以下文章