Seite 1 von 1

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

Verfasst: Mittwoch 5. September 2007, 12:50
von C4S3
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,

Verfasst: Mittwoch 5. September 2007, 13:43
von CrackPod
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

Verfasst: Mittwoch 5. September 2007, 13:50
von C4S3
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:

Verfasst: Mittwoch 5. September 2007, 13:53
von Rebecca
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

Verfasst: Mittwoch 5. September 2007, 14:17
von C4S3
: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:

Verfasst: Mittwoch 5. September 2007, 15:46
von Leonidas
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.

Verfasst: Donnerstag 6. September 2007, 07:43
von C4S3
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?

Verfasst: Donnerstag 6. September 2007, 09:43
von Zap
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 ;)