在Python中将函数传递给类

时间:2016-01-10 13:20:39

标签: python function class python-3.x menu

所以我正在研究基于文本的菜单的类结构。我需要在实际运行代码之前创建菜单并设置操作。因此,为了避免函数被提前调用,我创建了一个名为Run的类,它接受给定的函数并运行它。我的问题是我不知道应该如何处理函数的参数。到目前为止我所拥有的,哪些不起作用是:

class Run:
    def __init__(self, func):
        self.func = func

    def execute(self):
        print('Running')
        self.func

def foo(*args):
    print(*args)

baz = Run(foo('bar'))

baz.execute()

要清楚我首先要在运行baz.execute()

时运行该功能

1 个答案:

答案 0 :(得分:1)

您在将该函数传递给Run之前调用该函数,因此func实际上是调用它的结果(None,因为它不会返回任何内容)。最小的修复是:

class Run:

    def __init__(self, func, *args, **kwargs):
        self.func = func
        self.args = args
        self.kwargs = kwargs

    def execute(self):
        print('Running')
        self.func(*self.args, **self.kwargs)  # call func here


baz = Run(foo, 'bar')  # don't call func here
baz.execute()

但是,您可以使用functools.partial执行此操作,无需维护自己的课程并将.execute添加到最终调用中(您也可以通过重命名execute来消除此类调用到__call__

>>> from functools import partial
>>> def foo(*args):
    print(*args)


>>> baz = partial(foo, 'bar')
>>> baz
functools.partial(<function foo at 0x1059c4400>, 'bar')
>>> baz()
bar