Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测Python类属性值的变化并记录它_Python_Class_Logging - Fatal编程技术网

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

检测Python类属性值的变化并记录它,python,class,logging,Python,Class,Logging,我有一个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.da

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

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

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)

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

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)

一种可能的方法是使用
属性
(属性是用Python中的描述符实现的,因此您可以编写自己的描述符,以获得更强大、更灵活的属性访问控制):

输出:

self._response = 10
self._response = 101

一种可能的方法是使用
属性
(属性是用Python中的描述符实现的,因此您可以编写自己的描述符,以获得更强大、更灵活的属性访问控制):

输出:

self._response = 10
self._response = 101

使用
\uuuu setattr\uuuu
捕捉类属性值的变化

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

使用
\uuuu setattr\uuuu
捕捉类属性值的变化

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

欢迎您的可能副本!!。如果你喜欢的话,你可以投票支持我的答案!。不客气!!。如果你喜欢的话,你可以投票支持我的答案!。这很好..唯一的问题是,第一次实例化类时,init方法被激发,我的日志中出现了类似“response is set to None”的内容..有没有办法避免这种情况..@Amistad
\uuuu setattr\uuuu
方法在设置任何值时被调用。因此,如果您使用
response=None
初始化
BaseWorkFlow
类,也将调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。这是不可避免的。这很好..唯一的问题是,第一次实例化类时,init方法被激发,我的日志中出现了类似“response is set to None”的内容..有没有办法避免这种情况..@Amistad
\uu setattr\uuuu
方法在设置任何值时被调用。因此,如果您使用
response=None
初始化
BaseWorkFlow
类,也将调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。这是不可避免的。