我在python中有一个具有许多方法的类,如下所示:
marquee{
background: url('https://i.postimg.cc/g2ZJTkHk/images.png') no-repeat;
background-size: cover;
}
很明显,每次self.response的值更改时,我都需要记录它。当前我正在使用显式日志记录语句来执行此操作。但是,现在我的代码中充满了日志语句。此外,添加新方法时手动更新日志语句非常困难。
有没有什么方法可以编写函数或修饰器,以便在self.Any的任何类方法中为self.response分配新值时自动进行日志记录操作?
答案 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