extend dict derived class by setattr

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
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Hallo,
ich habe eine eigene Klasse aus der Klasse "Greets" dict abgeleitet und möchte nun während der Laufzeit einem Objekt a dieser Klasse mit settatr(a, "hi", "mom") eine neue Eigenschaft "hi" mit dem Wert "mom" zuweisen. Leider geht das nicht, da -wie ich meine- die Klasse dict setattr nicht untestützt.
Wäre es am besten in meine neue Klasse "Greets" um diese Funktion zu erweitern? (http://code.activestate.com/recipes/389 ... verloading)

Danke.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

"Geht nicht" ist schon mal eine sehr schlechte Fehlerbeschreibung, du solltest schon sagen, was nicht geht. Fehlermeldung, Traceback, was ist die Eingabe, was erwartest du und was passiert tatsächlich. Wenn ich dich richtig verstanden habe, dann hast du eine Klasse "Greets" welche du von "dict" abgeleitet hast. In diesem Fall verhält sich "Greets" wie ein Dictionary, du kanns neue Werte also mittes ``greets["hi"] = "mom"`` zuweisen.

Du solltest dir aber wirklich überlegen, ob du wirklich von dict ableiten möchtest, da Vererbung eine ist-ein-Beziehung darstellt. Gerade im Fall von Basisdatentypen wie Dictionaries oder Listen ist das aber oftmals gar nicht gewünscht, sondern eher eine Komposition.

Code: Alles auswählen

class Greets(object):
    def __init__(self):
        self.greets = dict()

    def __setitem__(self, key, value):
        self.greets[key] = value

    def __getitem__(self, key):
        return self.greets[key]
Das hat den Vorteil, dass du nicht auf alle Methode achten musst, welche von dict bereitgestellt werden. Unter Umständen machen einige dict-Operationen auf deinen Daten keinen Sinn. Um sagen zu können, welcher Ansatz für dich der bessere ist, bräuchten es aber ein paar mehr Informationen zu der Greets-Klasse. Konkret also, was diese macht und was diese können soll.
Das Leben ist wie ein Tennisball.
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Hallo,
"Geht nicht" bedeutet, dass mir in Idle eine Fehlermeldung ausgegeben wird und unter eclipse sogar nichts passiert, d.h. es wird weder das objekt erweitert, noch eine Fehlermeldung ausgegeben.
Ich werde es ggf. mal ausprobieren das Script auf eine Komposition umzustellen. Dafür muss ich dann aber leider an vielen Stellen den Zugriff ändern. Um zukünftig auch die beiden Methoden setattr und getattr nutzen zu können, hätte ich nur die Klasse anpassen brauchen, deshalb war das mein erster Gedanke
Allerdings bin ich mir z.Zt garnicht mehr sicher ob mein Problem nicht andere Ursachen hat. Im Debugging (eclipse) sehe ich das neue attribut nicht, aber ich kann trotzdem darauf zugreifen ...

Code: Alles auswählen

class greets(dict):
    def __init__(self):
        dict.__init__(self)
        
d = greets()
setattr(d, "hi", "Mom")
print d.hi
liefert "Mom"
Anfangs hatte ich in Idle

Code: Alles auswählen

a = {"eins":2}
setattr(a, "drei", 4)
versucht und eine Fehlermeldung erhalten, weshalb ich dachte die Vererbung vom dict wäre ursächlich
Antworten