Seite 1 von 1

extend dict derived class by setattr

Verfasst: Montag 17. September 2012, 16:47
von hypnoticum
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.

Re: extend dict derived class by setattr

Verfasst: Montag 17. September 2012, 17:06
von EyDu
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.

Re: extend dict derived class by setattr

Verfasst: Dienstag 18. September 2012, 09:04
von hypnoticum
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