我有一个库中的类,比如说 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/