声明后装饰方法

时间:2013-11-06 18:24:46

标签: python python-decorators

我有一个来自图书馆的课程,请说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

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

2 个答案:

答案 0 :(得分:2)

你可以像这样装饰它:

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)

然后,您可以将此装饰器重用于任何类定义所需的任何方法。这就是@符号或多或少的作用:)

希望这有帮助!

答案 1 :(得分:1)

def safe_method(self, *args):
  result = self.my_method(*args)
  if result is None: raise ValueError()
  return result

MyClass.my_method = safe_method

上面发生的是你正在用另一种方法替换MyClass.my_method,而另一种方法又调用my_method。因此,您收到了递归错误。

试试这个:

MyClass._my_method = MyClass.my_method

def safe_method(self, *args):
    result = self._my_method(*args)
    if result is None:
        raise ValueError()
    return result

MyClass.my_method = safe_method