0

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

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()

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

4

1 回答 1

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)


    
于 2020-08-05T11:19:10.367 回答