Вопрос

Я использую argparse в моей программе Python, и я хочу позвонить метод Когда я запускаю свое программное обеспечение, как это:

$ 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»?

Это было полезно?

Решение

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

 func = foo

Вы делаете

 func = theobject.foo

Сделанный!

Другие советы

Вы дали правильный ответ сами. Просто поставить:

func = Your_Class.your_method

вместо:

func = 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'

Если по «методу» вы имеете в виду «метод экземпляра»: вы не можете вызвать метод экземпляра с примером, поэтому сначала понадобится экземпляр. Тогда вы можете просто обратиться к 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top