有些问题可以通过装饰器(容易)和元类来解决。但是很少有问题,其结果只能通过元类来实现。例如,考虑一个非常简单的代码重复问题。
我们想要调试类方法,我们想要的是每当类方法执行时,它应该在执行它的主体之前打印它的完全限定名。
我们想到的第一个解决方案是使用方法装饰器,以下是示例代码 -
from functools import wraps
def debug(func):
'''decorator for debugging passed function'''
@wraps(func)
def wrapper(*args, **kwargs):
print("Full name of this method:", func.__qualname__)
return func(*args, **kwargs)
return wrapper
def debugmethods(cls):
'''class decorator make use of debug decorator
to debug class methods '''
# check in class dictionary for any callable(method)
# if exist, replace it with debugged version
for key, val in vars(cls).items():
if callable(val):
setattr(cls, key, debug(val))
return cls
# sample class
@debugmethods
class Calc:
def add(self, x, y):
return x+y
def mul(self, x, y):
return x*y
def div(self, x, y):
return x/y
mycal = Calc()
print(mycal.add(2, 3))
print(mycal.mul(5, 2))
输出:
Full name of this method: Calc.add
5
Full name of this method: Calc.mul
10








暂无数据