[dictionary] Werte zurückgeben [gelöst]

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Mittwoch 5. September 2007, 12:50

Hallo mitsammen!

Ich spiele gerade ein wenig mit "dictionaries" herum. Nun bin ich an einem Punkt angelangt, an dem ich einen vom Benutzer eingegebenen Wert als "key" und ein Objekt als "value" übergebe.

Code: Alles auswählen

def addUser(self):
        print """\nPerson hinzufuegen:\n"""
        pers_id = raw_input("Name zum Speichern der Person: ")
        person_name = raw_input("Name der Person: ")
        person_alter = int(raw_input("Alter der Person: "))
        person_prof = raw_input("Beruf der Person: ")

        self.my_dic[pers_id] = Person(person_name, person_alter, person_prof)
        print "\nPerson gespeichert, danke!\n"
Dies scheint auch ganz gut zu funktionieren.
Wenn ich jetzt nach einem Eintrag ("key") suchen will, so mache ich das so:

Code: Alles auswählen

    def searchUser(self):
        suchwort = raw_input("Bitte Suchwort eingeben:\n")

        if suchwort in self.my_dic:
            print "Gefunden:"

            print self.my_dic.get(suchwort)
Nur möchte ich die Werte zum gefundenen Schlüssel dann auch ausgeben, und das funktioniert leider nicht.
Der Output in IDLE sieht so aus:
Idle hat geschrieben:Gefunden:
<__main__.Person object at 0x010B3A90>
Ich hab hier auch noch "Python gepackt" vor mir liegen und darin steht, dass ich eigentlich mit

Code: Alles auswählen

self.my_dic.get(suchwort)
glücklich werden sollte, aber auch da bekomme ich dieselbe Ausgabe.

Hat jemand einen Tip für mich, wie ich mein "Objekt" (also die Instanz der Klasse Person mit seinen 3 Feldern "Name", "Alter" und "Beruf") wieder herausbekomme?

Für jeden Tip dankbar,
Zuletzt geändert von C4S3 am Donnerstag 6. September 2007, 07:43, insgesamt 1-mal geändert.
Gruß!
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Mittwoch 5. September 2007, 13:43

Hallo,

du bekommst ja nur die Instanz des Personenobjekts zurück. Mit der musst du dann weiter arbeiten.
Entweder das Objekt hat eine Methode `get' oder sowas ähnliches, die dir die Namen ausgibt oder du musst eine solche implementieren.
Eine andere Möglichkeit wäre, dass du die Methode `__str__' implementierst, die aufgerufen wird wenn du `print Person' ausfürhst. Dort schreibst du dann wie die Attribute(also Name etc) ausgegeben werden

Code: Alles auswählen

class Person:
  def __str__(self):
    print 'Name', self.name
    print 'Telefonnummer', self.nummer
So in etwa.
LG
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Mittwoch 5. September 2007, 13:50

Danke für die Hilfe!

Hm, getter und setter Methoden zum Abrufen/Ändern der Felder eines Person-Objekts sind vorhanden. Aber wie kann ich diese an so einem "anonymen" Objekt aufrufen?
Da hakts nämlich.

:oops:
Gruß!
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mittwoch 5. September 2007, 13:53

Wenn dein Objekt z.B. ein Attribut "name" hat:

Code: Alles auswählen

print self.my_dic.get(suchwort).name
EDIT: Oder auch:

Code: Alles auswählen

a = self.my_dic.get(suchwort)
print a.name
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Mittwoch 5. September 2007, 14:17

:shock:

So einfach ist das? In meinem Fall habe ich keine "public" Attribute, sondern eben nur Getter und Setter Methoden.
Aber es funktioniert trotzdem wunderbar. Einfach hinten die Methode aufrufen und "boom", da ist's auch schon.

Wow, bin ich beeindruckt. Das ist so einfach und logisch, dass ich mich richtig schäme. :oops:
Gruß!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 5. September 2007, 15:46

C4S3 hat geschrieben:So einfach ist das? In meinem Fall habe ich keine "public" Attribute, sondern eben nur Getter und Setter Methoden.
Getter? Setter? Wozu das? Dafür gibts in Python Properties und auch die sind recht selten nötig.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Donnerstag 6. September 2007, 07:43

Dafür gibts in Python Properties und auch die sind recht selten nötig.
Hab ich (als Neuling) noch nie gehört. Habe gestern schon die Online-Docs durchsucht, bin aber ehrlich gesagt nicht glücklich geworden.
Wie sieht sowas denn aus?
Gruß!
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Donnerstag 6. September 2007, 09:43

So könnte das aussehen.

Code: Alles auswählen

class C(object):
    def __init__(self):
        self.__x = 0

    def getx(self):
        return self.__x

    def setx(self, x):
        assert x > 0, "Der Wert x muss positiv sein!"
        self.__x = x

    x = property(getx, setx)

Code: Alles auswählen

In [2]: test = C()

In [3]: test.x
Out[3]: 0

In [4]: test.x = 100

In [5]: test.x
Out[5]: 100

In [6]: test.x = -10
---------------------------------------------------------------------------
<type 'exceptions.AssertionError'>        Traceback (most recent call last)

H:\<ipython console> in <module>()

H:\propertytest.py in setx(self, x)
      7
      8     def setx(self, x):
----> 9         assert x > 0, "Der Wert x muss positiv sein!"
     10         self.__x = x
     11

<type 'exceptions.AssertionError'>: Der Wert x muss positiv sein!

In [7]: test.x
Out[7]: 100
Man sollte sich aber gut überlegen ob man sowas wirklich braucht.
Python ist nicht Java ;)
Antworten