热线电话:13121318867

登录
2019-03-20 阅读量: 523
解决元类问题

有些问题可以通过装饰器(容易)和元类来解决。但是很少有问题,其结果只能通过元类来实现。例如,考虑一个非常简单的代码重复问题。

我们想要调试类方法,我们想要的是每当类方法执行时,它应该在执行它的主体之前打印它的完全限定名。

我们想到的第一个解决方案是使用方法装饰器,以下是示例代码 -

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
0.0000
3
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子