python - 适用于允许您指定应调试哪些方法的类的 Python 装饰器。我该如何实施?
问题描述
我正在做一个项目,我需要实现适用于函数和类的调试器装饰器。为了更好地解释,我向您展示了代码:
class debug(object):
def __init__(self, function):
self.function = function
def __call__(self, *args, **kwargs):
print()
print(f"Calling function: {self.function}")
print(f"args: {args}") ; print(f"kwargs: {kwargs}")
result = self.function(*args, **kwargs)
print(f"result is: {result}")
return result
def _debug(function):
def wrapper(*args,**kwargs):
print()
print(f"Calling function: {function}")
print(f"ARGS: {args}") ; print(f"KWARGS: {kwargs}")
result = function(*args, **kwargs)
print(f"RESULT IS: {result}")
return result
return wrapper
@debug # or @_debug
def foo(x,y):
return x+y
class cdebug(object):
pass
def _cdebug(...):
pass
class pallino(object):
def __init__(self,x,y):
self.x = x
self.y = y
def goo(self):
return self.x+self.y
@cdebug('oops', 'goo') # or @_cdebug('oops', 'goo')
class pinco(pallino):
def __init__(self,x,y,z):
super().__init__(x, y)
self.z = z
def oops(self,a):
return self.x+self.y+self.z-a
if __name__ == '__main__':
foo(10,20)
p = pinco(2,5,7)
p.oops(4)
p.goo()
我在实现适用于函数的调试器装饰器时没有遇到重大问题,无论是作为类(debug)还是作为函数(_debug)。但我真的不知道如何在两个版本(cdebug 和 _cdebug)中执行适用于类的调试器装饰器。当我调用作为参数传递给装饰器的方法之一(例如:p.goo() 或 p.oops(..))时,它应该允许我以与调试器装饰器类似的方式调试它们做一个简单的功能。
解决方案
您可以构建一个子类,并装饰子类的方法。这样您就不会修改装饰器可以预期的原始类:
def cdebug(cls):
class wrapper(cls):
pass
for name, method in inspect.getmembers(cls, inspect.isfunction):
# this one will not decorate special methods
if not (name.startswith('__') and name.endswith('__')):
setattr(wrapper,name, _debug(getattr(cls, name)))
return wrapper
推荐阅读
- javascript - Angular,类型脚本注释不起作用
- c# - 用特殊字符替换所有连续出现的字符
- java - IMAP:忽略错误响应,抛出:com.sun.mail.iap.ParsingException:FETCH 解析中的错误,索引处无法识别的项目
- node.js - NODE APP:Systemd 启动脚本不起作用?
- java - 如何使用 MyBatis 迭代一个对象的所有字段?
- android - Firestore 使用包含多个字段
- html - 用于多服务器公共网站的 html 私有 IP 重定向
- node.js - setHeader(“Content-Type”,值)中需要node.js http“值”吗?
- javascript - 如何在中心对齐谷歌地理图表图例
- java - 如何使 70 字节的 .class 文件打印“Hello World”?