2011-01-07 1 views
1

Я использую argparse в моей питона программе, и я хочу, чтобы вызвать метод когда я бегу мое программное обеспечение, как это: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"?

ответ

5

Вы просто ссылаетесь на метод вместо функции. Ага. Это так просто. Вместо

func = foo 

Вы делаете

func = theobject.foo 

Готово!

+1

Да, это правильно! Мне жаль, потому что мой вопрос был глупым. Проблем не было. Я использую @staticmethod вместо объявления экземпляра. Спасибо :-) –

+0

Что делать, если мне нужны основные параметры анализатора для создания 'theobject'? – zhigang

+0

Получить обходное решение: args.func .__ call __ (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

Да, но «ваш_метод» должен быть статическим методом (@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' 
Смежные вопросы