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