properies for dict member

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
fuppes
User
Beiträge: 28
Registriert: Dienstag 15. April 2008, 22:33

Hallo,

ist es moeglich die properties fur meien class so einzurichten das die setter methode aufgerufen wirde wenn eine element des dicts einen neuen wert zugeweisen bekommen?

Beispiel:

Code: Alles auswählen

class dependency_object(object):
    def __init__(self, xml):
        self.xml = xml
        


    def compare_to(self, other, with_version = False):
        if self.coor['groupId'] == other.coor['groupId']:
            if self.coor['artifactId'] == other.coor['artifactId']:
                if with_version:
                    if self.coor['version'] == other.coor['version']:
                        return True
                    else:
                        return False
                else:
                    return False

    def get_coor(self):
        return apf.getCoordinates_as_dict(self.xml)

    def set_coor(self, new):
        print 'neuer wert', new
       


    coor = property(get_coor, set_coor)
Die setter wird ja ausgeführt wenn ich coor einen neuen wert zuweise:
testing.coor = 'neuerWert'

Wenn ich jedoch einem element in dem dict einen neuen wert zuweise wird die setter nicht ausgefuehrt:
testing.coor['groupId'] = 'newGroupId'

Gibt es da ne möglichkeit das auch fuer diesen fall die Setter aufgreufen wird?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Da musst du schon in `getCoordinates_as_dict` etwas zurückliefern, dass dein gewünschtes Verhalten implementiert. Du hast es doch in der Hand.

Eine Möglichkeit wäre z.B. eine Unterklasse von `dict`, bei der du `__setitem__` überschrieben hast. Das erwischt aber nicht alle destruktiven Änderungen, sodass ich diese Weg lieber nicht gehen würde, sondern statt eines `dict` ein komplett eigenes Objekt benutzen würde, wo du Änderungen besser im Griff hast.

So, wie du das dict benutzt, scheint mir das eh besser ein Exemplar einer eigenen Klasse zu sein, die Attribute für groupId, artifactId, version, usw. hat.

Stefan
Antworten