TL; DR: Definieren einer eindeutigen Menge von Getter und Setter für jede Eigenschaft() 'd Variable saugt. Kann ich generische Getter und Setter definieren und sie mit der von mir gewünschten Variablen verwenden?Python: Generische Getter und Setter
Lassen Sie uns sagen, dass ich eine Klasse mit einigen netten Getter und Setter machen:
class Foo
def getter(self):
return _bar+' sasquatch'
def setter(self, value):
_bar = value+' unicorns'
bar = property(getter, setter)
ziemlich groß, nicht wahr?
Jetzt sagen wir, ich habe eine andere Variable namens "baz" und ich will nicht, dass es aus diesem Sasquatch/Einhorn Spaß weggelassen wird. Nun, ich glaube, ich könnte einen anderen Satz von Getter und Setter machen:
class Foo
def bar_getter(self):
return _bar+' sasquatch'
def bar_setter(self, value):
_bar = value+' unicorns'
bar = property(bar_getter, bar_setter)
def baz_getter(self):
return _baz+' sasquatch'
def baz_setter(self, value):
_baz = value+' unicorns'
baz = property(baz_getter, baz_setter)
Aber das ist nicht sehr trocken und unnötig meinen Code unübersichtlich. Ich schätze, ich könnte es ein wenig machen DRYer:
Obwohl das meinen Code DRYer machen könnte, ist es nicht ideal. Wenn ich zwei weitere Variablen unicornify und sasquatchifizieren möchte, müsste ich vier weitere Funktionen hinzufügen!
Es muss einen besseren Weg geben, dies zu tun. Kann ich einen einzelnen generischen Getter und/oder Setter für mehrere Variablen verwenden?
Unicorn-less und sasquatch-less reale Implementierung: Ich benutze SQLAlchemy ORM, und möchte einige der Daten beim Speichern und Abrufen von der Datenbank transformieren. Einige der Transformationen sind auf mehr als eine Variable anwendbar, und ich möchte meine Klassen nicht mit Gettern und Sätzen überladen.
Aber die lambdas die Getter und Setter auf eine einzelne Ausdrücke beschränken, die nicht geeignet ist, was ich brauche, um machen. –
@TheronLuhn So machen Sie das Gleiche, aber mit allgemeinen Funktionen (entweder definiert als innere Funktionen von 'Sasquatchicorn' oder die einen Namen als Argument annehmen). Oder machen Sie den vollständigen Descriptor-Deal wie in [agf] (http://stackoverflow.com/a/10149431/344821) Antwort. – Dougal
Oder mach das Ding in meinem Schnitt, was vielleicht etwas weniger Arbeit ist als eine vollständige Beschreibung? Könnte sein? :) – Dougal