यहाँ, एक दोहरा सवाल यह है कि एक सैद्धांतिक भाग के साथ, और एक व्यावहारिक एक:उपclassing dict: dict.__ init __() को बुलाया जाना चाहिए?
जब उपवर्गीकरण dict:
class ImageDB(dict):
def __init__(self, directory):
dict.__init__(self) # Necessary??
...
चाहिए dict.__init__(self)
कहा जा, बस एक "सुरक्षा" उपाय के रूप में (जैसे, मामले में कुछ गैर-मामूली कार्यान्वयन विवरण हैं जो महत्वपूर्ण हैं)? क्या dict.__init__()
नामक पाइथन के भविष्य के संस्करण के साथ कोड ब्रेक है? मैं एक चीज़ या दूसरे को करने का मौलिक कारण ढूंढ रहा हूं, यहां (व्यावहारिक रूप से, dict.__init__()
को सुरक्षित करना सुरक्षित है)।
मेरा अनुमान है कि जब ImageDB.__init__(self, directory)
कहा जाता है, तो स्वयं पहले से ही एक नया खाली खाली वस्तु है, और इसलिए dict.__init__
पर कॉल करने की आवश्यकता नहीं है (मैं चाहता हूं कि पहले खाली होना खाली हो)। क्या ये सही है?
संपादित:
बुनियादी सवाल इसके बाद के संस्करण के पीछे और अधिक व्यावहारिक प्रश्न इस प्रकार है। मैं उप-वर्गीकरण के बारे में सोच रहा था क्योंकि मैं डीबी [...] वाक्यविन्यास का उपयोग अक्सर करता हूं (db.contents [...] हर समय करने के बजाय); ऑब्जेक्ट का एकमात्र डेटा (विशेषता) वास्तव में वास्तव में एक नियम है। मैं डेटाबेस में कुछ विधियों को जोड़ना चाहता हूं (जैसे get_image_by_name()
, या get_image_by_code()
, उदाहरण के लिए), और केवल __init__()
ओवरराइड करें, क्योंकि छवि डेटाबेस को उस निर्देशिका द्वारा परिभाषित किया गया है जिसमें यह शामिल है।
सारांश में, (व्यावहारिक) प्रश्न हो सकता है: क्या कुछ है कि एक शब्दकोश की तरह बर्ताव करता है, सिवाय इसके कि इसके प्रारंभ अलग है के लिए एक अच्छा कार्यान्वयन है (यह केवल एक निर्देशिका का नाम लेता है), और यह अतिरिक्त है कि तरीकों?
कई उत्तरों में "कारखानों" का उल्लेख किया गया था। तो मुझे लगता है कि यह सब नीचे उबलता है: क्या आप 0 वर्गओवरराइड करते हैं और विधियों को जोड़ते हैं, या आप एक (फैक्ट्री) फ़ंक्शन लिखते हैं जो एक नियम देता है, जिसमें आप विधियां जोड़ते हैं? मैं पहला समाधान पसंद करने के इच्छुक हूं, क्योंकि फैक्ट्री फ़ंक्शन एक ऑब्जेक्ट देता है जिसका प्रकार इंगित नहीं करता है कि इसमें अतिरिक्त अर्थशास्त्र और विधियां हैं, लेकिन आपको क्या लगता है?
संपादित 2:
मैं हर किसी के जवाब से इकट्ठा कि यह एक अच्छा विचार dict उपवर्ग के लिए जब नया वर्ग "एक शब्दकोश नहीं है", और विशेष रूप से अपने __init__
विधि ही नहीं ले जा सकते हैं जब नहीं है तर्क के रूप में तर्क __init__
(जो ऊपर "व्यावहारिक प्रश्न" में मामला है)। दूसरे शब्दों में, यदि मैं सही ढंग से समझता हूं, तो सर्वसम्मति प्रतीत होती है: जब आप उप-वर्ग करते हैं, तो सभी विधियों (प्रारंभिक समेत) में बेस क्लास विधियों के समान हस्ताक्षर होना चाहिए। यह उदाहरण के लिए dict.__init__()
की तरह subclass_instance.__init__()
की गारंटी के लिए isinstance (subclass_instance, dict) को अनुमति देता है।
एक और व्यावहारिक प्रश्न तब पॉप अप करता है: इसकी कक्षा प्रारंभिक विधि को छोड़कर, एक वर्ग जो सिर्फ ताना की तरह है, को लागू किया जाना चाहिए? subclassing के बिना? इसके लिए कुछ परेशान बॉयलरप्लेट कोड की आवश्यकता होगी, नहीं?
एक फैक्ट्री फ़ंक्शन जाने का तरीका है। यदि आपको * इंस्टेंस * व्यवहार को कस्टमाइज़ करने की आवश्यकता है, तो आप उप-वर्ग बनाना चाहते हैं। यदि आप * प्रारंभिकरण * को ओवरराइड करना चाहते हैं * आपको कुछ भी उपclassing की आवश्यकता नहीं है, क्योंकि आपके उदाहरण मानक से अलग नहीं हैं। याद रखें कि __init__ को उदाहरण के इंटरफ़ेस का हिस्सा नहीं माना जाता है, लेकिन कक्षा का। –
जहां तक मैं इसे इस समस्या के लिए देखता हूं, वहां एक dictgetitem__' विधि को आपके छवि डीबी में एक उप-वर्ग के बजाय जोड़ने के लिए सबसे अच्छा होगा, क्योंकि यह _not_ एक dict# है। यह आपको वही करने की अनुमति देता है जो आप चाहते हैं, _without_ उन सभी विधियों जैसे 'पॉप()' जो आपकी कक्षा के लिए अनुचित प्रतीत होता है। –
@gs: अच्छा बिंदु, पॉप के बारे में; वास्तव में, कम से कम इस पल के लिए, अप्रासंगिक (डेटाबेस सामग्री केवल प्रारंभिक पर परिभाषित है)। मुझे लगता है कि यह वास्तव में सबसे अच्छा है कि कार्यान्वयन आवश्यक सुविधाओं को कसकर फिट करता है। – EOL