मुसीबत
मैं एक पायथन प्रोजेक्ट पर काम कर रहा हूं जिसका मुख्य वर्ग थोड़ा " गॉड ऑब्जेक्ट " है। वहाँ रहे हैं तो friggin 'कई गुण और तरीकों!
मैं क्लास को रिफ्लेक्टर करना चाहता हूं।
अब तक…
पहले चरण के लिए, मैं अपेक्षाकृत सरल कुछ करना चाहता हूं; लेकिन जब मैंने सबसे सरल दृष्टिकोण की कोशिश की, तो इसने कुछ परीक्षणों और मौजूदा उदाहरणों को तोड़ दिया।
मूल रूप से, वर्ग में विशेषताओं की एक लंबी सूची है - लेकिन मैं स्पष्ट रूप से उन्हें देख सकता हूं और सोच सकता हूं, "ये 5 विशेषताएँ संबंधित हैं ... ये 8 भी संबंधित हैं ... और फिर बाकी हैं।"
getattr
मैं मूल रूप से संबंधित विशेषताओं को एक तानाशाह की तरह सहायक श्रेणी में समूहित करना चाहता था। मुझे लगता है __getattr__कि यह नौकरी के लिए आदर्श होगा। इसलिए मैंने विशेषताओं को एक अलग वर्ग में स्थानांतरित कर दिया, और, निश्चित रूप से पर्याप्त, __getattr__अपने जादू को पूरी तरह से काम किया ...
सबसे पहले ।
लेकिन फिर मैंने एक उदाहरण चलाने की कोशिश की। उदाहरण उपवर्ग सीधे ( वर्ग स्तर पर ) इन विशेषताओं में से एक को सेट करने का प्रयास करता है । लेकिन चूंकि अभिभावक वर्ग में यह विशेषता "शारीरिक रूप से स्थित" नहीं थी, इसलिए मुझे यह कहते हुए एक त्रुटि हुई कि यह विशेषता मौजूद नहीं थी।
@संपत्ति
मैंने तब @propertyडेकोरेटर के बारे में पढ़ा । लेकिन फिर मैंने यह भी पढ़ा कि यह उन उपवर्गों के लिए समस्याएँ पैदा करता है जो तब करना चाहते हैं self.x = blahजब xमूल वर्ग की संपत्ति होती है।
चाहा हे
- सभी क्लाइंट कोड का उपयोग करना जारी रखें
self.whatever, भले ही माता-पिता कीwhateverसंपत्ति "भौतिक रूप से" कक्षा (या उदाहरण) में न हो। - समूह से संबंधित विशेषताओं को तानाशाह की तरह कंटेनरों में।
- मुख्य कक्षा में कोड की चरम नीचता को कम करें।
उदाहरण के लिए, मैं इसे बदलना नहीं चाहता:
larry = 2
curly = 'abcd'
moe = self.doh()
इस मामले में:
larry = something_else('larry')
curly = something_else('curly')
moe = yet_another_thing.moe()
... क्योंकि वह अभी भी शोर है। यद्यपि यह सफलतापूर्वक एक ऐसी चीज़ में आसानी से विशेषता बनाता है जो डेटा का प्रबंधन कर सकती है, मूल में 3 चर थे और ट्विक किए गए संस्करण में अभी भी 3 चर हैं।
हालांकि, मैं इस तरह से कुछ के साथ ठीक हो जाएगा:
stooges = Stooges()
और यदि कोई विफलता के लिए खोज करता self.larryहै, तो कुछ जाँच करेगा stoogesऔर देखेगा कि क्या larryहै। (लेकिन यह भी काम करना होगा अगर कोई उपवर्ग larry = 'blah'वर्ग स्तर पर करने की कोशिश करे ।)
सारांश
- माता-पिता वर्ग में विशेषताओं के संबंधित समूहों को एक एकल विशेषता के साथ बदलना चाहते हैं जो सभी डेटा को कहीं और संग्रहीत करता है
- मौजूदा क्लाइंट कोड के साथ काम करना चाहते हैं
larry = 'blah'जो वर्ग स्तर पर उपयोग करता है (जैसे) - उपवर्गों को कुछ भी बदले बिना जानने के लिए इन refactored विशेषताओं को बढ़ाने, ओवरराइड करने और संशोधित करने की अनुमति देना जारी रखना चाहते हैं
क्या यह संभव है? या मैं गलत पेड़ को काट रहा हूं?