2017-07-18 9 views
0

Ich bin ziemlich neu im Programmieren und habe mich selbst Python in meiner Freizeit unterrichtet. Ich versuche wirklich OOP zu verstehen und habe eine Wand getroffen. Dies ist ein kleineres Beispiel für ein größeres Programm, das ich schreibe.Python 3 - Suche in OOP

class Emp(): 
    def __init__(self, first, last, age): 
     self.first = first 
     self.last = last 
     self.age = age 

    def PrintEmp(self): 
     return (self.first, self.last, self.age) 

employee = {} 

employee[0] = {'Info': {'First': 'Jacob', 'Last': 'Jones', 'Age': 31}} 
employee[1] = {'Info': {'First': 'Joe', 'Last': 'Smith', 'Age': 45}} 
employee[2] = {'Info': {'First': 'Jim', 'Last': 'Bob', 'Age': 38}} 
employee[3] = {'Info': {'First': 'Jack', 'Last': 'Black', 'Age': 21}} 
employee[4] = {'Info': {'First': 'Joey', 'Last': 'John', 'Age': 39}} 
employee[5] = {'Info': {'First': 'Job', 'Last': 'God', 'Age': 99}} 

for key in employee: 
    employee[key]['Info']['First'] = Emp(employee[key]['Info']['First'], 
            employee[key]['Info']['Last'], 
            employee[key]['Info']['Age']) 

choice = input('Employee') 

for key in employee: 
    if choice == employee[key]['Info']['First']: 
     print(choice.PrintEmp) 
     #choice.first, choice.last, choice.age ect... 
    else: 
     print("This isn't working") 

Ich versuche, im Grunde durch eine Liste von bekannten Mitarbeitern zu suchen und dann etwas von dem eigentlichen Objekt druckt oder nur direkt durch die Objekte nach bestimmten Attributen suchen.

+0

Funktioniert etwas nicht wie erwartet würde? Welche Frage möchten Sie beantwortet haben? –

+0

Sie müssen kein Wörterbuch mit 'info' erstellen. Sie brauchen sogar kein Wörterbuch für jede Person. Bessere separate Objekte von 'Emp' erstellen und sie in einer Liste hinzufügen. Führen Sie dann eine Suchabfrage über die Liste aus, indem Sie die Inline-'for' -Schleife verwenden. –

+0

@PratikGaikwad - Es ist mir nie aufgefallen, ein Objekt ohne Label zu "machen" und in eine Liste zu setzen. So konnte ich mein Problem lösen. – pyRN

Antwort

0

Wie bereits von dm03514 notiert, hat Ihre if-condition nicht funktioniert, weil Sie eine Zeichenfolge mit einer Klasseninstanz verglichen haben.

Nächste Ausgabe, PrintEmp() ist eine Funktion von Emp und nicht Wahl, daher funktioniert nicht.

können Sie wollen, dies versuchen:

class Emp(): 
    def __init__(self, first, last, age): 
     self.first = first 
     self.last = last 
     self.age = age 

    def PrintEmp(self): 
     return (self.first, self.last, self.age) 

employee = {} 

employee[0] = {'Info': {'First': 'Jacob', 'Last': 'Jones', 'Age': 31}} 
employee[1] = {'Info': {'First': 'Joe', 'Last': 'Smith', 'Age': 45}} 
employee[2] = {'Info': {'First': 'Jim', 'Last': 'Bob', 'Age': 38}} 
employee[3] = {'Info': {'First': 'Jack', 'Last': 'Black', 'Age': 21}} 
employee[4] = {'Info': {'First': 'Joey', 'Last': 'John', 'Age': 39}} 
employee[5] = {'Info': {'First': 'Job', 'Last': 'God', 'Age': 99}} 


employees = [] 
for key in employee: 
    employees.append(
     Emp(
      employee[key]['Info']['First'], 
      employee[key]['Info']['Last'], 
      employee[key]['Info']['Age'] 
     ) 
    ) 

choice = input('Employee first name:\n') 

for employee in employees: 
    if choice == employee.first: 
     print (employee.PrintEmp()) 
    else: 
     print("This isn't working") 

Returns für 'Jim':

This isn't working 
This isn't working 
('Jim', 'Bob', 38) 
This isn't working 
This isn't working 
This isn't working 
+0

Vielen Dank für Ihre Eingabe, nachdem ich das gelesen hatte, konnte ich meinen Code korrigieren. Im Wesentlichen habe ich eine große .json-Datei, die ich in das Programm eingelesen habe und jeder Schlüssel wurde in das Objekt mit seinen Werten als die Attribute gelegt. Ich wollte buchstäblich nur eine Eingabeaufforderung haben, die es mir erlaubt, die Datenbank zu durchsuchen und den angegebenen Schlüssel mit seinen Attributen zu drucken. Ich war entschlossen, jedes einzelne Objekt (emp1 = Emp (args)) benennen zu müssen und im wesentlichen nach emp1 zu suchen. Vielen Dank noch mal. – pyRN

+0

Großartig :) Bitte akzeptieren Sie eine Antwort, damit die Frage als gelöst markiert wird. –

0

choice wahrscheinlich nicht übereinstimmen, da Sie die Benutzereingabezeichenfolge mit einer Emp Instanz vergleichen.

Wenn Sie entfernt:

for key in employee: 
    employee[key]['Info']['First'] = Emp(employee[key]['Info']['First'], 
            employee[key]['Info']['Last'], 
            employee[key]['Info']['Age']) 

Sie sollten durch und Spiel Mitarbeiter basierend auf Vorname mindestens laufen können.


Was OOP, würde ich empfehlen, bei festen Ausgang, die 5 Design-Prinzipien sind und eine große Leitlinie für OOP Entwicklung.

https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

Ich denke, ihre stärkste Suite ist, dass sie uns einige Konzepte geben zu bewerten Code durch, und geben Sie uns einen Platz zu sprechen beginnen, und uns mit gemeinsamer Terminologie zur Verfügung stellen.


2 erstaunlich nützliche Konzepte der Programmierung und OOP sind: Kapselung und Delegation.

Ich könnte mir eine Sammlung von Mitarbeitern vorstellen, die eine search() Methode offen legt. Dies würde verhindern, dass sich Ihr Hauptcode ändern muss, wenn Sie Ihre Suchimplementierung verbessern/ändern, und er isoliert die Suchlogik nur auf Teile des Programms, die dessen Besonderheiten kennen müssen.

+0

SOLID scheint eine Version von REPL für OOP zu sein. SOLID ist ein gutes Konzept für zukünftige Unternehmungen. Vielen Dank. Schließlich wird eine search() -Methode in meinem Code platziert. Baby Schritte. – pyRN

0

Willkommen bei der Programmierung! Ich habe vor etwas weniger als einem Jahr begonnen, mich selbst zu unterrichten, so dass ich mich auf jede Frustration, die beim Lernen eines neuen Konzepts entstehen kann, beziehen kann.

Ich beginne mit dem, was Sie zuerst zu erreichen versuchen - Aufruf Ihrer PrintEmp Methode einer Emp Instanz. Der Grund dafür, dass Ihr aktueller Code nicht so funktioniert, wie Sie möchten, ist, dass Sie alle employee (Wenn ich glaube, dass Sie wirklich nur eine Übereinstimmung finden möchten) durchlaufen, und dann wird Ihre Bedingung nie wie beabsichtigt ausgewertet, weil choice eine str ist Objekt und Ihre Schlüssel in employee sind ganze Zahlen. Im folgenden Beispiel beginne ich mit dem Wörterbuch, das die benötigten Werte enthält, um eine Instanz von Emp mit info = value['Info'] zu erstellen. Von dem jetzt in der Variablen info gespeicherten Wörterbuch kann ich die Werte, die ich benötige, mit info.values() und dann I unpack diese Werte als Argumente für jede erstellte Emp Instanz abrufen. Jetzt, da jedes Wörterbuch in ein Emp Objekt umgewandelt wurde, können wir PrintEmp so nennen, wie wir möchten.

Hinweis: Ich habe mir die Freiheit genommen, Ihre Benennung des Wörterbuchs employee zu employees zu ändern, da es ein bisschen genauer ist.

# Here we instantiate each `employee` 
for key, value in employees.items(): 
    info = value['Info'] # e.g. here I now have {'First': 'Jacob', 'Last': 'Jones', 'Age': 31} 

    # Now I am going to create an `Emp` instance for each dictionary in `employees` 
    employees[key] = Emp(*info.values()) 

choice = int(input('Enter an employee index: ')) 

if choice in employees: 
    print(employees[choice].PrintEmp()) 
else: 
    "That still isn't working..." 

das Programm läuft nun:

>>> Enter an employee index: 2 
returning: ('Jim', 'Bob', 38) 

Sagen Sie bitte die Ausgabe Ihrer PrintEmp Methode formatiert werden wollte - Sie str.format Methode, wie so verwenden können:

def PrintEmp(self): 
    # Note the type conversion for self.age 
    return "Hi my name is {} {}, and I'm {}!".format(self.first, self.last, str(self.age)) 

das Programm Lauf jetzt:

>>> Enter an employee index: 2 
returning: Hi my name is Jim Bob, and I'm 38! 

Wenn Sie Fragen haben möchten, zögern Sie nicht zu fragen!