python - 检测 Python 类属性值的变化并记录它
问题描述
我在python中有一个类,有很多方法如下:
import logging
logger = logging.getLogger(__name__)
class BaseWorkFlow:
def __init__(self, response=None):
self.response = response
def func1(self):
self.response = 10
logger.info(self.response.data)
def func2(self):
self.response = 20
logger.info(self.response.data)
def func3(self):
self.response = 20
logger.info(self.response.data)
很明显,每次 self.response 的值发生变化时,我都需要记录它。目前我正在使用显式日志语句来执行此操作。但是,现在我的代码中到处都是日志语句。此外,当添加新方法时,手动更新日志语句非常困难。
是否有任何方法可以编写函数或装饰器,在任何时候 self.response 在任何类方法中被分配一个新值时自动执行日志记录操作?
解决方案
一种可能的方法是使用property
(属性是用 Python 中的描述符实现的,因此您可以编写自己的描述符以获得更强大和灵活的属性访问控制):
class BaseWorkFlow:
def __init__(self, response=None):
self._response = response
@property
def response(self):
return self._response
@response.setter
def response(self, value):
self._response = value
# logging after setting
print(f'self._response = {self._response}')
def func1(self):
self.response = 10
def func2(self):
self.response = 20
def func3(self):
self.response = 20
bwf = BaseWorkFlow()
bwf.func1()
bwf.response = 101
输出:
self._response = 10
self._response = 101
推荐阅读
- javascript - 我的组件在第一次渲染中无法读取属性,但在第二次渲染中我的属性已经有了
- swift - 对齐 UISwitch 以对齐到中心
- java - Java初学者手动输入值并打印对象void main的详细信息
- javascript - 达到最小值或最大值时停止拖动事件
- amazon-web-services - AWS VPC 中的安全数据库
- c++ - 为什么 std::thread::join 在这里出现段错误?
- c# - 我如何在不同类的异步方法中执行 ping 和接收 ms?
- python - 将 Iris 数据集目标名称应用于混淆矩阵
- java - 是否可以将 ORM 与 Vert.x 一起使用?
- javascript - RegExp 中的无效正则表达式错误