检测 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 分配新值时自动执行日志记录操作?


子衿沉夜
浏览 431回答 3
3回答

当年话下

一种可能的方法是使用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 = 20bwf = BaseWorkFlow()bwf.func1()bwf.response = 101输出:self._response = 10self._response = 101

www说

您可以通过分离更新响应值和日志记录的代码来实现它。import logginglogger = logging.getLogger(__name__)class BaseWorkFlow:    def __init__(self, response=None):        self.response = response    def func1(self):        self.update_response(10)    def func2(self):        self.update_response(20)    def func3(self):        self.update_response(20)    def update_response(response_value):        self.response = response_value        logger.info(selfl.response.data)

心有法竹

使用__setattr__捕捉不断变化的类属性的值。import logginglogger = logging.getLogger(__name__)class BaseWorkFlow:    def __init__(self, response=None):        self.response = response    def __setattr__(self, name, value):        if name == 'response':            logger.info('{} is set to {}'.format(name, value))    def func1(self):        self.response = 10    def func2(self):        self.response = 20    def func3(self):        self.response = 30
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python