2010-12-29 8 views
1

modifizieren lassen Sie uns sagen, dass ich eine Klasse, die als int an die Außenwelt verhält, aber in Wirklichkeit ist ein veränderliches Objekt, das einen festen Platz in mehrere Strukturen hat. Wenn n mein Objekt ist, kann ich es jetzt aktualisieren, indem ich n.update(34) schreibe, aber ich finde, dass ich immer n = 34 stattdessen schreiben möchte. Ich habe über http://docs.python.org/reference/datamodel.html einen Blick zu, und nichts wie ein _ _ assign _ _ oder _ _ Wert _ _ Attribut sehen, die mich Falle der = Operator lassen würde und mir erlauben, mein Objekt zu aktualisieren, anstatt einen int zu der Variablen zuweisen n, mein Objekt wegwerfen. Besser noch, wenn ein veränderbares Element in einem Tupel t = (m, n) ist, würde ich gerne mein veränderbares Element mit t[1] = 34 aktualisieren, aber Python sieht das als einen Versuch, ein unveränderliches zu modifizieren.pythonic Weg, um eine veränderbare innerhalb einer unveränderlichen

also denke ich, wäre die Antwort, auf dem, was wenig von diesem Dokument, das ich grok konnte, dass das, was ich bin versucht, ist nicht Pythonic. Wenn ich es nicht so machen kann, wie ich es möchte, was wäre dann das nächstbeste? so dass, wenn jemand eines Tages meinen Code beibehalten muss, er nicht übermäßig beleidigend sein wird.

Antwort

3

Ihre grundlegende obj.value = newvalue ist im Grunde die beste, verständlichste Art und Weise. Wie Sie vermuten, ist es nicht möglich, die Zuweisung in Python zu überschreiben.

Sie könnten __call__() in Ihrer Klasse implementieren, um die Zuweisung durchzuführen, so dass Sie einfach obj(newvalue) tun können. Dem flüchtigen Leser ist jedoch nicht klar, dass dies eine Neuzuordnung ist.

würde Eine andere Idee __ilshift__() so können Sie obj <<= newval tun zu implementieren sein. Das sieht zumindest nach einer Art Mutations-Neuzuweisungsoperation aus, wenn Sie hart genug schielen. Wenn es kein numerischer Typ wäre, könnte ich es berücksichtigen. Aber << hat eine wohldefinierte Bedeutung mit int und, da Sie als dieser Typ maskieren, wäre es IMHO verwirrend, es auf diese Weise zu verwenden.

+0

danke für die Ideen und für die Verbesserung meiner begrenzten Verständnis dieser Konzepte. Ich werde den Code für den Moment in Ruhe lassen, da ich immer noch echte Arbeit damit zu tun habe, aber wenn es Zeit für ein Update wird, werde ich eine Entscheidung treffen. –

Verwandte Themen