我在我的python程序中使用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”?
答案 0 :(得分:5)
您只需参考方法而不是函数。对。就这么简单。而不是
func = foo
你做
func = theobject.foo
完成!
答案 1 :(得分:1)
你自己给出了正确的答案。只是说:
func = Your_Class.your_method
而不是:
func = foo
答案 2 :(得分: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'
答案 3 :(得分:0)
如果用“method”表示“实例方法”:你不能用实例调用实例方法,所以你首先需要一个实例。然后,您可以引用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
。