python - 创建一个函数,为对象的每个属性创建 getter 和 setter,以跟踪对象的更改
问题描述
我正在尝试跟踪对象的任何属性是否已更改,以便我可以保留一堆对象“版本”,用户可以在需要时恢复到这些“版本”(例如撤消\重做功能)。
为此,我想我可以为每个属性使用 getter 和 setter,并让 setter 调用一个跟踪更改的函数。由于我有 20 多个属性,因此我试图在不必编写 20函数对@property
的情况下做到这一点。@attribute.setter
下面的代码似乎很理想。但是,您不能将变量用作函数名,我也想不出一种传递self
给内部attr
和attr_setter
函数的好方法。
class MyClass:
def __init__(self, start, end):
self._start = start
self._end = end
self.create_getset()
def create_getset(self):
for attr in self.__dict__:
attr = attr[1:]
@property
def attr(self):
print(f'{attr} getter is called')
return self._attr
@attr.setter
def attr_setter(self, value):
setattr(self, attr, value)
# function to keep track of changes
鉴于此,一些问题:
(1) 这是为所有属性添加 getter 和 setter 的好方法吗?有没有更好的办法?
(2) 这是跟踪属性更改的合理好方法吗?
如果(1)和(2),那么我怎样才能使它工作?如何使用属性名称作为变量来创建添加 getter 和 setter 所需的函数?
解决方案
推荐阅读
- matlab - matlab支持阿拉伯语吗?
- python - 相同的函数签名但不同的参数
- android - 从主机连接到 Android 模拟器
- android-studio - Android 资源链接失败。如何解决 ic_launcher_foreground.xml 文件中的错误?
- pytorch - RuntimeError:后端 CUDA 的预期对象,但为参数 #3 'index' 获得了后端 CPU
- session - Spring Cloud Gateway 在调用资源服务器后删除 SESSION cookie
- python - 如何使用成对比较矩阵为我的分析找到最佳的 n 个候选者?
- python-3.x - 如何在执行前隐藏页面上显示的 jinja 内容?
- javascript - 如何使用 HTML 输入框设置 JavaScript 变量?
- javascript - 从嵌套的 JS 对象中删除其属性后删除空对象