टीएल; डीआर: प्रत्येक संपत्ति() 'डी परिवर्तनीय बेकार के लिए गेटर्स और सेटर्स का एक अद्वितीय सेट परिभाषित करने के लिए। क्या मैं सामान्य गेटर्स और सेटर्स को परिभाषित कर सकता हूं और उन्हें जो भी वैरिएबल चाहता हूं उसका उपयोग कर सकता हूं?पायथन: जेनेरिक गेटर्स और सेटर्स
मान लें कि मैं कुछ अच्छा getters और setters के साथ एक वर्ग बनाने:
class Foo
def getter(self):
return _bar+' sasquatch'
def setter(self, value):
_bar = value+' unicorns'
bar = property(getter, setter)
सुंदर महान, है ना?
अब मान लें कि मैंने "बाज़" नामक एक और चर डाला है और मैं नहीं चाहता कि इसे इस सॉसक्वैच/यूनिकॉर्न मजे से बाहर छोड़ा जाए। ठीक है, मुझे लगता है मैं getters और setters का एक और सेट कर सकता है:
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)
लेकिन वह बहुत शुष्क और बेकार में clutters मेरी कोड नहीं है। मुझे लगता है मैं यह थोड़ा ड्रायर बना सकता है:
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)
हालांकि यह है कि मेरे कोड ड्रायर कर सकता है, यह आदर्श नहीं है। अगर मैं दो और चरों को unicornify और sasquatchify करना चाहता था, तो मुझे चार और कार्यों को जोड़ना होगा!
ऐसा करने का एक बेहतर तरीका होना चाहिए। क्या मैं एकाधिक चरों में एक जेनेरिक गेटर और/या सेटर का उपयोग कर सकता हूं?
यूनिकॉर्न कम और sasquatch कम वास्तविक दुनिया कार्यान्वयन: मैं SQLAlchemy ORM उपयोग कर रहा हूँ, और जब भंडारण और डेटाबेस से यह पुन: प्राप्त करने डेटा के कुछ बदलना चाहते हैं। कुछ परिवर्तन एक से अधिक चर पर लागू होते हैं, और मैं अपने वर्गों को गेटर्स और सेटर्स के साथ अव्यवस्थित नहीं करना चाहता हूं।
लेकिन lambdas एक भी भाव को setters और getters की सीमा है, जो कि मैं क्या करने की जरूरत है के लिए उपयुक्त नहीं है कर। –
@TheronLuhn तो वही काम करें लेकिन सामान्य कार्यों के साथ (या तो 'sasquatchicorn' के आंतरिक कार्यों के रूप में परिभाषित किया गया है या जो एक तर्क के रूप में नाम लेता है)। या [एएसएफ] (http://stackoverflow.com/a/10149431/344821) के जवाब में पूर्ण वर्णनकर्ता सौदा करें। – Dougal
या मेरे संपादन में चीज करें, जो एक पूर्ण वर्णनकर्ता करने से थोड़ा कम काम हो सकता है? शायद? :) – Dougal