Зарегистрировать общий метод среди классов в python - PullRequest
0 голосов
/ 05 августа 2020

Я импортирую несколько классов из библиотеки с помощью общего метода, например

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, BarClass2 или BarClass3.

1 Ответ

1 голос
/ 05 августа 2020

Если вы не можете изменить код, вы всегда можете исправить классы ...

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)


    
...