2017-02-28 3 views
2

Ich habe eine Klasse, die verschiedene Methoden enthalten.akzeptieren Sie Befehle und rufen Sie die Methoden

jetzt möchte ich meine Haupt() fungiert als eine REPL. Ich habe verschiedene Befehle, die sich jeweils auf eine andere Methode beziehen. (ZB. Command1 (Call method1))

Ich möchte eine Aufforderung als >>> drucken und zu einem Zeitpunkt ein Befehl akzeptieren dann die Methode aufrufen

, wie ich dies tun kann?

class supermarket(object): 
      def __init__(self): 
        pass 
      def method1(self): 
        pass 
      def method2(self): 
        pass 
      ... 

    def main(): 

durch die Art und Weise, ich Python 3.5

+2

Es scheint, als wäre "argparse" eine gute Wahl für Sie. Dieses Tutorial könnte hilfreich sein https://pymotw.com/2/argparse/ – haifzhan

Antwort

3

bin mit Sie die getattr() Funktion können Attribute nach Namen holen, dann rufen Sie einfach das resultierende Objekt-Methode:

def main(): 
    s = supermarket() 
    while 1: 
     cmd = input('>>> ') # or raw_input('>>> ') if using Python < 3 
     if cmd in ('q', 'quit'): 
      break 
     print(getattr(s, cmd)()) 

, wenn die Methode Die Namen unterscheiden sich von den Befehlen, die Sie übersetzen müssen (und dann müssen Sie getattr nicht verwenden):

def main(): 
    s = supermarket() 
    while 1: 
     cmd = input('>>> ') 
     if cmd in ('q', 'quit'): 
      break 
     print({ 
      'command1': s.method1, 
      'command2': s.method2, 
      # ... 
     }[cmd]()) 
+0

Was bedeutet diese Zeile "if cmd in ('q', 'quit'): " bedeuten? – joe

+0

Wenn der Benutzer entweder 'q' oder' quit' eingibt, brechen wir aus der 'while1'-Schleife aus. Es ist ein sauberer Weg zu verlassen. – thebjorn

+0

Sie haben '' 'am Ende von' cmd = line' versehentlich gesetzt und ändern auch 'raw_input' in' input', da die Antwort für python 3.X lauten soll. Ich wusste nicht "getattr", danke! –

Verwandte Themen