2011-01-07 28 views
1

我在我的Python程序中使用argparse,我想叫方法當我運行我的軟件是這樣的:argparse:如何調用一個方法而不是函數?

$ python __init__.py foo 

這是很容易,如果我要調用一個函數,而不是一個方法:

def foo(args): 
    pass 

def main(): 
    foo_parser.set_defaults(func=foo) 

if __name__ == "__main__": 
    main() 

如何用「func = MyClass.my_method」替換「func = foo」?

回答

5

您只需引用方法而不是函數。對。這很簡單。取而代之的

func = foo 

你做

func = theobject.foo 

完成!

+1

是啊,這是正確的!我很抱歉,因爲我的問題很愚蠢。問題不在那裏。我使用@staticmethod而不是聲明一個實例。謝謝:-) –

+0

如果我需要主分析器選項來構建'theobject',該怎麼辦? – zhigang

+0

獲取解決方法:args.func .__調用__(theobject,args)。有更好的解決方案嗎? – zhigang

0

如果用「方法」表示「實例方法」:你不能用實例調用實例方法,所以你首先需要一個實例。然後,你可以參考obj.method並獲得BoundMethod,它可以記住的實例(obj) - 如:

class Cls: 
    def __init__(self, x): 
     self.x = x 
    def foo(self, new_x): 
     self.x = new_x 

obj = Cls(1) 
foo = obj.foo 
foo(2) # same as obj.foo(), but we don't need to keep obj for this! 
print(obj.x) #=>2 

如果它是一個靜態的(如果是的話,爲什麼99%的免費功能更易於使用和工作?同樣)或類方法,請參閱Cls.method

1

你自己給出了正確的答案。只要把:的

func = Your_Class.your_method 

代替:

func = foo 
+0

是的,但「your_method」必須是靜態方法(@staticmethod)。 –

1

您正在尋找這樣的事情:使用的

import argparse 

class Myclass(object): 

    def foo(self): 
     print 'foo' 

    def bar(self): 
     print 'bar' 

class Main(Myclass): 

    def __init__(self): 
     foo_parser = argparse.ArgumentParser() 

     foo_parser.add_argument('method') 
     self.args = foo_parser.parse_args() 

    def __call__(self, *args, **kws): 
     method = self.args.method 
     return getattr(self, method)(*args, **kws) 

if __name__ == "__main__": 
    main = Main() 

    main() 

例如:

$ python test.py foo 
'foo' 
$ python test.py bar 
'bar' 
相關問題