为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

子衿沉夜 2021-11-16 14:28:32
我在 python 中有一个类,有很多方法如下:import logginglogger = 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 分配新值时自动执行日志记录操作?
查看完整描述

3 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-11-16
?
www说

TA贡献1775条经验 获得超8个赞

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


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)


查看完整回答
反对 回复 2021-11-16
?
心有法竹

TA贡献1866条经验 获得超5个赞

使用__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


查看完整回答
反对 回复 2021-11-16
  • 3 回答
  • 0 关注
  • 406 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信