【问题标题】:Passing function to class in Python在Python中将函数传递给类
【发布时间】:2016-01-10 13:20:39
【问题描述】:

所以我正在研究基于文本的菜单的类结构。我需要在实际运行代码之前创建菜单并设置操作。因此,为了避免过早调用该函数,我创建了一个名为 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() 时运行

【问题讨论】:

  • 你为什么不直接使用functools.partial?您当前的尝试是调用foo,然后将结果传递给Run.__init__,因此注定会失败。
  • 我不知道functools.partial你能详细说明吗?
  • ...那你为什么不通过我提供的链接阅读它?
  • 我对 python 还很陌生,文档虽然准确,但并不总是对新手最友好:(
  • 但是,尽你所能地阅读它,你至少应该能够问一个比 “你能详细说明吗” 更具体的问题,或者,上帝保佑,去吧尝试一下

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2015-10-12
    相关资源
    最近更新 更多