TL; DR:必須爲每個屬性定義一組唯一的getter和setter()'d變量。我可以定義泛型getter和setter並將它們與我想要的任何變量一起使用嗎?Python:泛型getter和setter
比方說,我做了一些不錯的getter和setter類:
class Foo
def getter(self):
return _bar+' sasquatch'
def setter(self, value):
_bar = value+' unicorns'
bar = property(getter, setter)
非常偉大的,對不對?
現在,讓我們說,我把另一個變量稱爲「baz」,我不希望它從這個sasquatch /獨角獸的樂趣中排除。嗯,我想我可以做另一套getter和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)
但是,這不是很乾燥,不必要的雜波我的代碼。我想我可以讓它有點DRYer:
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)
雖然這可能會使我的代碼DRYer,它不是理想的。如果我想獨角獸和sasquatchify兩個更多的變量,我將不得不添加四個更多的功能!
必須有更好的方法來做到這一點。我可以在多個變量中使用單個通用getter和/或setter嗎?
獨角獸少和無sasquatch真實世界的實現:我使用SQLAlchemy ORM,並希望從數據庫存儲和檢索它時轉換某些數據。有些轉換適用於多個變量,我不想用getter和setter混淆我的類。
但lambda表達式限制getter和setter方法,以一個單一的表達,這是不適合我需要什麼做。 – 2012-04-13 23:17:17
@TheronLuhn所以做同樣的事情,但與一般功能(或定義爲'sasquatchicorn'的內部函數或名稱作爲參數)。或者按照[agf](http://stackoverflow.com/a/10149431/344821)的答案做完整的描述符處理。 – Dougal 2012-04-13 23:22:19
或者在我的編輯中做這件事,這可能比做一個完整的描述符稍微少一些。也許? :) – Dougal 2012-04-13 23:50:51