在python中记录类中的常用方法

Log common method among classes in python

我正在使用常用方法从库中导入多个 classes,例如

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

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


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.

中的代码

如果您无法修改代码,您可以随时 monkey-patch 类...

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)