Gibt es eine Möglichkeit, ein Dictionary von Funktionen zu erstellen, die set- und get-Anweisungen verwenden und sie dann als set verwenden und Funktionen erhalten?Verwenden Sie __get__, __set__ mit Wörterbuchelement?
class thing(object):
def __init__(self, thingy)
self.thingy = thingy
def __get__(self,instance,owner):
return thingy
def __set__(self,instance,value):
thingy += value
theDict = {"bob":thing(5), "suzy":thing(2)}
theDict["bob"] = 10
wollte Ergebnis ist, dass 10 in die Set-Funktion geht und ergänzt die bestehenden 5
print theDict["bob"]
>>> 15
tatsächliche Ergebnis ist, dass das Wörterbuch
print theDict["bob"]
>>> 10
den Eintrag mit dem numerischen Wert ersetzt Warum kann ich nicht einfach eine Funktion wie .. theDict ["bob"]. Add (10) machen, weil es sich um ein existierendes und bereits wirklich gut funktionierendes handelt g Funktion, die das Set verwendet und bekommt. Der Fall, mit dem ich arbeite, ist ein Randfall, und es wäre nicht sinnvoll, alles neu zu programmieren, um für diesen einen Fall Arbeit zu leisten.
Ich brauche einige Mittel, um Instanzen dieses set/get dingy zu speichern, das zugänglich ist, aber keine Ebene der Tiefe schafft, die vorhandene Referenzen brechen könnte.
Bitte fragen Sie nicht nach dem tatsächlichen Code. Es würde Seiten Code benötigen, um das Problem einzukapseln.
Was zum Teufel? Nein, '__get__' und' __set__' funktionieren nicht so. Ich wäre sehr misstrauisch gegenüber Ihrem bestehenden Design, wenn Ihr vorhandenes Design "dingy" auf dem Deskriptor selbst statt auf Objekten der Klasse speichert, an die der Deskriptor angehängt ist. – user2357112
Ich bin auch ziemlich verwirrt über diese Frage ... Ich verstehe nicht, wie '__get__' und' __set__' sich auf das beziehen, was Sie versuchen zu tun. Ich nehme an, dass Sie eine Wrapper-Klasse erstellen können, die '__getitem__' und' __setitem__' überschreibt, um das delegierte dict auf die von Ihnen gewünschte Art und Weise zu aktualisieren. Aber ohne echten Code zu sehen (oder zumindest ein minimales Beispiel dessen, was Sie wirklich erreichen wollen), wird es schwer sein, mehr Ratschläge zu geben als das ... – mgilson
Das Hauptproblem, das Sie haben, dass Sie müssen Entscheiden Sie, welches Objekt für Ihr benutzerdefiniertes Verhalten verantwortlich ist.Im Moment führen Sie eine Aktion auf Dictionary aus ('theDict [" bob "] = 10') weisen Sie 10 dem Schlüssel' bob' in 'theDict' zu (wie Sie sehen, erwähnt diese Beschreibung nicht einmal den zuvor unter diesem Schlüssel gespeicherten Wert) , aber erwarten Sie, benutzerdefinierte Logik in 'thing' auszunutzen. Wenn benutzerdefinierte Logik in "Sache" ist, fragen Sie "Sache", es zu tun, fragen Sie nicht dict. Und wenn Sie nicht können, überdenken Sie Ihr Design. –