TL; DR: Deve definire un insieme univoco di getter e setter per ciascuna proprietà() 'd variabile fa schifo. Posso definire getter e setter generici e usarli con qualsiasi variabile io voglia?Python: getter e setter generici
Diciamo che faccio una classe con alcuni getter e setter curato:
class Foo
def getter(self):
return _bar+' sasquatch'
def setter(self, value):
_bar = value+' unicorns'
bar = property(getter, setter)
Abbastanza grande, giusto?
Ora diciamo che ho messo in un'altra variabile chiamata "baz" e io non voglio che sia lasciato fuori da questo Sasquatch divertente/unicorno. Beh, credo che avrei potuto fare un altro set di getter e setter:
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)
ma non è molto secco e inutilmente ingombra il mio codice. Credo che avrei potuto fare un po 'asciugatrice:
class Foo
def unicornify(self, value):
return value+' unicorns'
def sasquatchify(self, value):
return value+' sasquatch'
def bar_getter(self):
return self.sasquatchify(_bar)
def bar_setter(self, value):
_bar = self.unicornify(_bar)
bar = property(bar_getter, bar_setter)
def baz_getter(self):
return self.sasquatchify(_baz)
def baz_setter(self, value):
_baz = self.unicornify(_baz)
baz = property(baz_getter, baz_setter)
Anche se questo potrebbe rendere il mio codice asciugatrice, non è l'ideale. Se volessi unicornify e sasquatchify altre due variabili, avrei dovuto aggiungere altri quattro funzioni!
Ci deve essere un modo migliore per farlo. Posso usare un singolo getter generico e/o setter tra più variabili?
Implementazione del mondo reale senza unicard e sasquatch: Sto utilizzando SQLAlchemy ORM e desidero trasformare alcuni dati durante l'archiviazione e il recupero dal database. Alcune delle trasformazioni sono applicabili a più di una variabile, e non voglio ingombrare le mie lezioni con getter e setter.
Ma le lambda limitare il setter e getter per un singolo espressioni, che non è adatto per quello che ho bisogno di fare. –
@TheronLuhn Quindi fai la stessa cosa ma con funzioni generali (definite come funzioni interne di 'sasquatchicorn' o che prendono un nome come argomento). Oppure fai il deal completo del descrittore come nella risposta [agf] (http://stackoverflow.com/a/10149431/344821). – Dougal
Oppure la cosa nella mia modifica, che è forse un po 'meno lavoro di un descrittore completo? Può essere? :) – Dougal