在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()
我觉得我在做很多代码重复,有没有更简单的方法呢?我的主要限制是无法修改 BarClass1
、BarClass2
或 BarClass3
.
中的代码
如果您无法修改代码,您可以随时 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)
我正在使用常用方法从库中导入多个 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()
我觉得我在做很多代码重复,有没有更简单的方法呢?我的主要限制是无法修改 BarClass1
、BarClass2
或 BarClass3
.
如果您无法修改代码,您可以随时 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)