TL; DR: Konieczne zdefiniowanie unikalnego zestawu modułów pobierających i ustawiających dla każdej właściwości() 'd zmienna zasysa. Czy mogę zdefiniować ogólne programy pobierające i ustawiające i używać ich z dowolną zmienną, jakiej potrzebuję?Python: Ogólne programy pobierające i ustawiające
powiedzmy robię lekcje z jakimiś ładnymi pobierające i ustawiające:
class Foo
def getter(self):
return _bar+' sasquatch'
def setter(self, value):
_bar = value+' unicorns'
bar = property(getter, setter)
Całkiem nieźle, prawda?
Załóżmy teraz, że dodałem inną zmienną o nazwie "baz" i nie chcę, aby ta gra sasquatch/jednorożca została pominięta. Cóż, myślę, że mogę zrobić inny zestaw pobierające i ustawiające:
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)
Ale to nie jest bardzo suche i niepotrzebnie zaśmieca mój kod. Myślę, że mógłbym zrobić to trochę Suszarka:
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)
Mimo, że może zrobić mój kod do włosów, to nie jest idealne. Jeśli chciałem unicornify i sasquatchify dwie kolejne zmienne, musiałbym dodać jeszcze cztery funkcje!
Musi być lepszy sposób na zrobienie tego. Czy mogę używać pojedynczego generycznego programu pobierającego i/lub ustawiającego dla wielu zmiennych?
Unicorn mniej i mniej Sasquatch realizacji w świecie rzeczywistym: Używam SQLAlchemy ORM i chcą przekształcić część danych podczas zapisywania i pobierania go z bazy danych. Niektóre transformacje mają zastosowanie do więcej niż jednej zmiennej i nie chcę zaśmiecać swoich klas za pomocą modułów pobierających i ustawiających.
Ale lambdas ograniczające ustawiające i pobierające do pojedynczych wyrazów, które nie nadaje się do tego, co muszę zrobić. –
@TheronLuhn Zrób to samo, ale z ogólnymi funkcjami (zdefiniowanymi jako wewnętrzne funkcje 'sasquatchicorn' lub przyjmujące nazwę jako argument). Lub wykonaj pełną deskryptor ofertę, jak w odpowiedzi [agf] (http://stackoverflow.com/a/10149431/344821). – Dougal
A może coś w mojej edycji, która może trochę mniej pracy niż wykonanie pełnego deskryptora? Może? :) – Dougal