首页 > 解决方案 > 检测 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 在任何类方法中被分配一个新值时自动执行日志记录操作?

标签: pythonclasslogging

解决方案


一种可能的方法是使用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

推荐阅读