微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

适用于类的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,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)。 但是我真的不知道如何在两个版本(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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。