2016-01-10 60 views
0

所以我正在研究基於文本的菜單的類結構。我需要在實際運行代碼之前創建菜單並設置操作。因此,爲了避免早期調用函數,我創建了一個名爲Run的類,它接受給定的函數並運行它。我的問題是我不知道該如何處理該函數的參數。我有什麼,到目前爲止,它不工作是:將函數傳遞給Python中的類

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

你爲什麼不只是使用['functools.partial'(https://docs.python.org/3/library/functools.html#functools.partial)?您當前的嘗試調用' foo'然後傳遞結果'運行.__ init__',所以註定要失敗的。 – jonrsharpe

+0

我不知道'functools.partial'你能elabor吃什麼好? – Rewned

+0

...那麼爲什麼你不通過我提供的鏈接瞭解它? – jonrsharpe

回答

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