Pregunta

Estoy utilizando argparse en mi programa de pitón y quiero llamar a un Método cuando corro mi software como este:

$ python __init__.py foo

Es fácil si quiero llamar a una función en lugar de un método:

def foo(args):
    pass

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

if __name__ == "__main__":
    main()

¿Cómo puedo reemplazar "func = foo" por "func = MyClass.my_method"?

¿Fue útil?

Solución

sólo se refiere al método en lugar de la función. Sip. Es fácil. En lugar de

 func = foo

hacer

 func = theobject.foo

Listo!

Otros consejos

Se dio la respuesta correcta a sí mismo. Sólo hay que poner:

func = Your_Class.your_method

en lugar de:

func = foo

¿Usted está buscando algo como esto:

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()

ejemplo de uso:

$ python test.py foo
'foo'
$ python test.py bar
'bar'

Si por el "método" que quiere decir "método de instancia": No se puede llamar a un método de instancia con el ejemplo, por lo que necesita primero una instancia. Entonces, sólo puede referirse a obj.method y obtener una BoundMethod la que se acuerda la instancia (obj) - por ejemplo:.

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

Si es una estática (si es así, ¿por qué? 99% en funciones libres son más fáciles de usar y funcionan igual de bien) o método de clase, sólo se refieren a Cls.method.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top