我该如何编写一个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/

10-12 16:48