Domanda

Sto usando argparse nel mio programma Python e voglio chiamare un metodo quando eseguo il mio software come questo:

$ python __init__.py foo

E 'facile se voglio chiamare una funzione invece di un metodo:

def foo(args):
    pass

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

if __name__ == "__main__":
    main()

Come posso sostituire "func = foo" con "func = MyClass.my_method"?

È stato utile?

Soluzione

Basta fare riferimento al metodo anziché la funzione. Sì. E 'così facile. Invece di

 func = foo

fare

 func = theobject.foo

Fatto!

Altri suggerimenti

ha dato la risposta corretta da soli. Basta mettere:

func = Your_Class.your_method

invece che:

func = foo

Sei alla ricerca di qualcosa di simile a questo:

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

esempio di utilizzo:

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

Se per "metodo" si intende "metodo di istanza": Non è possibile chiamare un metodo di istanza con esempio, quindi è necessario prima un'istanza. Quindi, si può solo fare riferimento a obj.method e ottenere un BoundMethod, che ricorda l'istanza (obj) - per esempio:.

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

Se è uno statico (se sì, perché? Nel 99% funzioni liberi sono più semplici da utilizzare e lavorare altrettanto bene) o metodo di una classe, basta fare riferimento a Cls.method.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top