Python argparse:如何调用方法而不是函数?

Python argparse:如何调用方法而不是函数?,python,argparse,Python,Argparse,我在python程序中使用argparse,我想在运行软件时调用方法,如下所示: $ python __init__.py foo import argparse class Myclass(object): def foo(self): print 'foo' def bar(self): print 'bar' class Main(Myclass): def __init__(self): foo_pars

我在python程序中使用argparse,我想在运行软件时调用方法,如下所示:

$ python __init__.py foo
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()
如果我想调用函数而不是方法,这很容易:

def foo(args):
    pass

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

if __name__ == "__main__":
    main()
如何将“func=foo”替换为“func=MyClass.my_method”?

如果“method”的意思是“instance method”:您不能用instance调用实例方法,因此需要先调用实例。然后,您只需参考
obj.method
,就可以得到一个
BoundMethod
,它可以记住实例(
obj
)-例如:

如果它是静态的(如果是,为什么?在99%的自由函数中,使用起来更简单,工作也更好)或类方法,只需参考
Cls.method

如果“method”是指“instance method”:您不能用instance调用实例方法,所以您首先需要一个实例。然后,您只需参考
obj.method
,就可以得到一个
BoundMethod
,它可以记住实例(
obj
)-例如:


如果它是静态的(如果是,为什么?在99%的自由函数中使用起来更简单,工作也一样好)或类方法,只需参考
Cls.method

您只需参考方法而不是函数。是的。就这么简单。而不是

 func = foo
是吗

 func = theobject.foo

完成了

您只需引用方法而不是函数。是的。就这么简单。而不是

 func = foo
是吗

 func = theobject.foo

完成了

你自己给出了正确的答案。只要说:

func = Your_Class.your_method
而不是:

func = foo

你自己给出了正确的答案。只要说:

func = Your_Class.your_method
而不是:

func = foo

你在找这样的东西吗:

$ python __init__.py foo
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'

你在找这样的东西吗:

$ python __init__.py foo
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'

是的,没错!我很抱歉,因为我的问题很愚蠢。问题不在那里。我使用@staticmethod而不是声明实例。谢谢:-)如果我需要主要的解析器选项来构造
theobject
,该怎么办?找到一个解决方法:args.func.\uuuu调用(theobject,args)。有更好的解决办法吗?@志刚:你为什么需要这个?Argparse用于解析参数,它不应该构造对象。似乎我无法使用注释粘贴代码。我会编辑这个主题是的,没错!我很抱歉,因为我的问题很愚蠢。问题不在那里。我使用@staticmethod而不是声明实例。谢谢:-)如果我需要主要的解析器选项来构造
theobject
,该怎么办?找到一个解决方法:args.func.\uuuu调用(theobject,args)。有更好的解决办法吗?@志刚:你为什么需要这个?Argparse用于解析参数,它不应该构造对象。似乎我无法使用注释粘贴代码。我将编辑此主题是的,但“您的方法”必须是静态方法(@staticmethod)。是的,但“您的方法”必须是静态方法(@staticmethod)。