【问题标题】:Log common method among classes in python记录python中类之间的常用方法
【发布时间】:2020-11-25 13:13:17
【问题描述】:

我正在使用通用方法从库中导入几个类,例如

class BarClass1:
    
    def __init__(self):
        pass        

    def bar(self, x):
        return x + 1

class BarClass2:
    
    def __init__(self):
        pass        

    def bar(self, x):
        return x + 2


class BarClass3:
    
    def __init__(self):
        pass        

    def bar(self, x):
        return x + 3

我想为每个类的 bar 方法添加日志记录,为此我通过以下方式为这些类创建子类:


def log_something(x):
    print(f'input is {x}')

class DerivedBarClass1(BarClass1):
    
    def __init__(self):
        super().__init__()   

    def bar(self, x):
        log_something(x)
        return super().bar()

class DerivedBarClass2(BarClass2):
    
    def __init__(self):
        super().__init__()   

    def bar(self, x):
        log_something(x)
        return super().bar()

class DerivedBarClass3(BarClass3):
    
    def __init__(self):
        super().__init__()   

    def bar(self, x):
        log_something(x)
        return super().bar()

我觉得我做了很多代码重复,有没有更简单的方法?我的主要限制是无法修改BarClass1BarClass2BarClass3 中的代码。

【问题讨论】:

    标签: python oop python-class


    【解决方案1】:

    如果您无法修改代码,您可以随时对类进行猴子补丁...

    import functools
    def add_logging_single_arg(f): # maybe a better name...
        @functools.wraps(f)
        def wrapper(self, x):
            log_something(x)
            return f(x)
        return wrapper
    
    for klass in [BarClass1, BarClass2, BarClass3]:
        klass.bar = add_logging_single_arg(bar)
    
    
        
    

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 2020-07-09
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多