1

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

$ python __init__.py foo

如果我想调用函数而不是方法,这很容易:

def foo(args):
    pass

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

if __name__ == "__main__":
    main()

如何将 "func=foo" 替换为 "func=MyClass.my_method" ?

4

4 回答 4

5

您只需引用方法而不是函数。是的。就这么容易。代替

 func = foo

你做

 func = theobject.foo

完毕!

于 2011-01-07T14:25:33.537 回答
1

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

func = Your_Class.your_method

代替:

func = foo
于 2011-01-07T14:32:18.937 回答
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'
于 2011-01-07T14:35:57.407 回答
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.

于 2011-01-07T14:16:12.030 回答