2016-06-29 5 views
0

Also mein Ziel ist es, ein Bestellsystem für ein Café mit verschiedenen Arten von Kaffee zur Verfügung zu stellen. Im Moment habe ich Schwierigkeiten zu verstehen, warum mein Code nicht ausgeführt wird, wenn ich der Code nichts ausführen passiert und ich bin nicht sicher, warumBrauchen Sie Hilfe zu verstehen, warum mein Code nicht läuft [Python]

class Coffee(object): 

    def __init__(self,name): 
     self.name = name 

    def coffee (self, coffee_type, price): 
     self.coffee_type = coffee_type 
     self.price = price 

class Order(object): 

    def __init__(self, name): 
     self.name = name 

    def newOrder (self, coffee_type, coffee_amount): 
     this.coffee_type = coffee_type 
     this.coffee_amount = coffee_amount 




class Main(object): 

    def __init__ (self, name): 
     self.name = name 


    from Coffee import coffee 

    flat_white = coffee("1 : Flat White", 3.50) 
    long_black = coffee("2 : Long Black", 3.50) 
    cappuccino = coffee("3 : Cappuccino", 4.00) 
    espresso = coffee("4 : Espresso", 3.25) 
    latte = coffee("5 : Latte", 3.50) 

    Ordering = 'Y' 

    while Ordering == 'Y': 
     try: 
      order_coffee = int(input("What coffee would you like to order?", pprint (vars(coffee)))) 
      break 

     except: 
      ValueError 
      print ("wrong input") 

     order_amount = input("How many would you like to order?") 

     if order_coffee == 1: 
      new_Order(flat_white, order_amount) 

     elif order_coffee == 2: 
      new_Order(long_black, order_amount) 

     elif order_coffee == 3: 
      new_Order(cappuccino, order_amount) 

     elif order_coffee == 4: 
      new_Order(espresso, order_amount) 

     elif order_coffee == 5: 
      new_Order(latte, order_amount) 

     else: 
      print ("Please enter a valid number") 
      break 
+0

Dieser Code wird nicht alles ausführen, wie ist. Wie versuchen Sie Ihr Bestellsystem zu führen? Sie brauchen kein Hauptobjekt, Sie können diesen Code nur in einem 'if __name __ ==" __ main __ ":' Block haben. Oder setzen Sie den Code in eine 'main()' -Funktion, die in diesem Block aufgerufen wird. – arewm

+0

Wenn ich deinen Code starte, wird in der Zeile 'from Coffee import coffee'' ImportError: Kein Modul mit dem Namen 'Coffee'' angezeigt. Bitte erkläre, wie du dein Programm ausführen willst, sonst kann niemand helfen. –

+1

Wie @ TadhgMcDonald-Jensen darauf hingewiesen hat, ist mein Kommentar hier falsch.Es wird laufen. Sie können meine Antwort unten für einige Probleme und Lösungen sehen, die ich gesehen habe. – arewm

Antwort

0

Es sieht aus wie es gibt einige Probleme mit Ihrem Code. Ich werde versuchen, dir mit einem Paar zu helfen.

Erstens, keine Notwendigkeit für die __init__ Methode, einen Namen zu akzeptieren. So stellen Sie das Verfahren die notwendigen Informationen für das Objekt annehmen:

class Coffee(object): 
    def __init__ (self, coffee_type, price): 
     self.coffee_type = coffee_type 
     self.price = price 

class Order(object): 
    def __init__(self, coffee_type, coffee_amount): 
     self.coffee_type = coffee_type 
     self.coffee_amount = coffee_amount 

Zweitens, da sie nicht wirklich etwas tun, können Sie die Main Klasse auf eine Ausführung in einem bedingten ersetzen können, wie sie typischerweise in Python-Programme/Skripte zu sehen ist :

if __name__ =="__main__": 
    ... # put main code here 

als nächstes wird die except wie es geschrieben wird, alle Ausnahmen fangen erschwert Debuggen. Wenn Sie nur die ValueError fangen wollen, tun:

except ValueError: 
     print ("wrong input") 

Wenn Sie den Stromfluss verwenden (dh mit dem tryexcept Block, sollten Sie alle in der Größenordnung Logik innerhalb des try Block setzen, wie es jeder macht nicht Sinn außerhalb. auch die notwendigen Variablen benötigt (order_coffee) nicht definiert werden, wenn Sie ein ValueError haben.

ein break nach Annahme der Bestellung Eingang Hinzufügen führen, dass Sie aus der Ordnung Schleife zu brechen, nachdem ein Auftrag eingegeben wird. Dies ist wahrscheinlich kein beabsichtigtes Verhalten.No break ist benötigt hier. Dito für nach der Ausgabe "Please enter a valid number". Wenn Sie einen Order erstellen, müssen Sie nur Order(coffee_type, coffee_amount) anrufen. Stellen Sie beim Erstellen dieses Auftrags sicher, dass Sie ihn auch auf eine Variable setzen. wahrscheinlich so etwas wie:

new_order = Order(flat_white, order_amount) 

Printing „Bitte geben Sie eine gültige Zahl“ und „falsche Eingabe“ ist etwas redundant. Sie benötigen nur einen von ihnen, um unter ungültiger Eingabe zu drucken.

Schließlich wird pprint Sachen auszudrucken dann wieder None so print(..., pprint(x)) wird eine zusätzliche None drucken, sobald es ziemlich fertig ist x Druck, sondern nennen nur pprint, als wäre es ein weiterer Anruf zu print war.

- -

alle diese Änderungen vorgenommen haben, werden Sie mit etwas wie Ende:

class Coffee(object): 

    def __init__ (self, coffee_type, price): 
     self.coffee_type = coffee_type 
     self.price = price 

class Order(object): 

    def __init__(self, coffee_type, coffee_amount): 
     self.coffee_type = coffee_type 
     self.coffee_amount = coffee_amount 

if __name__ =="__main__": 

    coffee_available=[Coffee("1 : Flat White", 3.50), 
         Coffee("2 : Long Black", 3.50), 
         Coffee("3 : Cappuccino", 4.00), 
         Coffee("4 : Espresso", 3.25), 
         Coffee("5 : Latte", 3.50)] 

    ordering = 'Y' 

    while ordering == 'Y': 

     print("Coffee Type\t\tPrice") 
     print("-----------\t\t-----") 
     for coffee in coffee_available: 
      print("{}\t- - -\t$ {}".format(coffee.coffee_type,coffee.price)) 
     print() 
     order_coffee = int(input("What is the number of the coffee you want? ")) 

     order_amount = input("How many would you like to order? ") 

     new_order = None 

     if order_coffee >= 1 and order_coffee <=5: 
      new_order = Order(coffee_available[order_coffee-1], order_amount) 

     else: 
      print ("Please enter a valid number") 
+0

"Sie werden nichts ausführen, wenn Sie diese Datei ausführen." Hast du versucht? Der Code in einem Klassenblock wird wie ein 'if True:' - Block ausgeführt (mit spezieller Behandlung der dort definierten Variablen), so dass der Code in der 'Klasse Main' ** tatsächlich ausgeführt wird. (versteh mich nicht falsch viele deiner Zeiger werden hilfreich sein für das OP) –

+0

Ich habe nicht versucht, es zu starten, ich hatte nie zuvor diese Verwendung gesehen und so war es das erste Problem, das ich sah. Danke, dass du auf meinen Fehler hingewiesen hast. – arewm

+1

kein Problem ([verwandte Frage hier] (http://stackoverflow.com/questions/26193653/why-does-a-class-body-get-executed-at-definition-time)) Das OP wird definitiv nicht verwendet diese Mechanik in der beabsichtigten Weise. Ein Beispiel dafür ist [Unterprozess bedingt die internen Methoden für Windows und dann für Unix unterschiedlich zu definieren] (https://github.com/tadhgmister/cpython/blob/master/Lib/subprocess.py#L1126) –

Verwandte Themen