我该如何编写一个Python类来处理未定义方法的调用,首先要从给定的模块中获取同名函数的输出,然后对该输出做进一步的处理?
例如,给定add(x,y),doublerInstance.add(1,1)应该返回4。
我知道_ _ getattr _ _()拦截未定义方法的调用,并且getattr()可以检索函数对象。但是我不知道如何将参数传递给_ _ getattr _ _()捕获到由getattr()检索的函数的未定义调用。
EXAMPLE
Module functions.py:
def add(x, y):
return x +
Module doubler.py:
class Doubler:
def __init__(self, source):
self.source = source
def __getattr__(self, attrname):
fnc = getattr(self.source, attrname)
return fnc() * 2
Session:
>import functions as f
>import doubler as d
>doublerInstance = d.Doubler(f)
>doublerInstance.add(1, 2)
<snip> TypeError: add() takes exactly 2 arguments, (0 given)
END
我确实理解错误-getattr()返回要运行的函数,并且调用fnc()不会将任何参数传递给该函数-在这里是add()。但是,如何获取传递给调用dblr.add(1,2)的参数,并将其传递给getattr()调用返回的函数?
我正在寻找执行此操作的正确方法,而不是_ _ getattr _ _的一些用法。我意识到使用@的装饰器函数在这里可能是更好的工具,但是我对这些函数的了解还不够,无法看到它们是否可以在此处应用。
还-我应该寻找什么资源自己解决这个问题?我没有在Lutz书籍,Cookbook或Python Library Reference中找到它。
最佳答案
调用doublerInstance.add(1, 2)
时,会从中获取属性add
,然后再调用它。但是在您的getattr内部,您正在返回一个值。您必须返回一个函数。
无论如何,为了使这种特殊情况起作用,您需要:
def __getattr__(self, attrname) :
fnc = getattr(self.source, attrname)
def doubled(*args, **kwargs) :
return 2 * fnc(*args, **kwargs)
return doubled
关于python - 进一步处理未定义方法的输出(Python),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/521111/