检测Python类属性值的变化并记录它
我有一个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
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
。这是不可避免的。