我有一个库中的类,比如说 MyClass 和一个方法 my_method

from MyLibrary import MyClass
obj = MyClass()
result = obj.my_method('arg')

我无法修改原始实现,但我想装饰 my_method ,特别是我想检查返回值是否为 not None 以及是否引发异常,如:
result = obj.my_method('arg')
if result is None: raise ValueError()

这很无聊,因为我需要做很多次。特别是我不想在调用 obj.my_method('arg') 时更改代码。我在尝试着:
def safe_method(self, *args):
  result = self.my_method(*args)
  if result is None: raise ValueError()
  return result

MyClass.my_method = safe_method

这不起作用:
RuntimeError: maximum recursion depth exceeded while calling a Python object

我明白为什么,但我无法解决问题

最佳答案

你可以这样装饰它:

def safe_decorator(func):
    def wrapper(self, *args):
        result = func(self, *args)
        if result is None:
            raise ValueError()
        return result
    return wrapper

MyClass.my_method = safe_decorator(MyClass.my_method)

然后,您可以将这个装饰器重用于任何类定义中的任何方法。这就是 @ 表示法或多或少的作用:)

希望这可以帮助!

关于python - 声明后装饰方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19819797/

10-14 04:50