检测Python类属性值的变化并将其记录

时间:2019-02-22 06:31:19

标签: python class logging

我在python中有一个具有许多方法的类,如下所示:

marquee{
  background: url('https://i.postimg.cc/g2ZJTkHk/images.png') no-repeat;
  background-size: cover;
}

很明显,每次self.response的值更改时,我都需要记录它。当前我正在使用显式日志记录语句来执行此操作。但是,现在我的代码中充满了日志语句。此外,添加新方法时手动更新日志语句非常困难。

有没有什么方法可以编写函数或修饰器,以便在self.Any的任何类方法中为self.response分配新值时自动进行日志记录操作?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您可以通过在更新响应值和记录日志时分离代码来实现。

import logging
logger = 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)

答案 2 :(得分:0)

使用__setattr__来捕获类属性的变化值。

import logging
logger = 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