2010-07-16 15 views
9

यह एक प्रश्न है जो मुझसे another question द्वारा प्रेरित किया गया है।Django सार मॉडल बनाम सरल पायथन मिश्रण बनाम पायथन एबीसी

Django Abstract base classes कार्यक्षमता (जो पाइथन में एबीसी कक्षाओं के समान नहीं है) प्रदान करता है ताकि कोई मॉडल (Django के मॉडल। मॉडल) बना सके जिससे कोई उत्तराधिकारी हो सके, लेकिन उस मॉडल के बिना वास्तविक तालिका में डेटाबेस। मॉडल के मेटा क्लास में 'सार' विशेषता सेट करके इस व्यवहार को ट्रिगर करता है।

अब सवाल: Django इस तरह क्यों हल करता है? इस विशेष प्रकार के 'सार बेस क्लास' मॉडल की आवश्यकता क्यों है? ऑब्जेक्ट क्लास से विरासत में और मॉडल मॉडल को मौजूदा मॉडल के साथ मिलाकर मॉडल मिश्रण क्यों न करें? या यह पाइथन एबीसी के लिए भी एक काम से कर सकता है? (ध्यान रखें कि आप मैं अजगर में एबीसी वर्गों के साथ बहुत परिचित नहीं हूँ, मेरी अज्ञानता यहाँ दिखाई दे सकते हैं)

उत्तर

11

मैं यथोचित संक्षिप्त होने की कोशिश करता हूँ, क्योंकि यह आसानी से एक लंबा आक्षेप में बदल सकते हैं:

एबीसी हैं बाहर क्योंकि उन्हें केवल पायथन 2.6 में पेश किया गया था, और Django डेवलपर्स के पास पाइथन संस्करण समर्थन के लिए एक सेट रोडमैप है (2.3 समर्थन केवल 1.2 में गिरा दिया गया था)।

ऑब्जेक्ट-विरासत मिश्रणों के लिए, वे पठनीयता को कम करने के बजाय अधिक तरीकों से कम पाइथोनिक होंगे। Django मेटाक्लास का उपयोग Model ऑब्जेक्ट्स के लिए करता है, जो वास्तव में प्रारंभिकरण पर परिभाषित मॉडल गुणों का विश्लेषण करता है, और Meta विकल्प, और अन्य गुणों के साथ Model._meta पॉप्युलेट करता है। दोनों प्रकार के मॉडल के लिए उस ढांचे का पुन: उपयोग करना समझ में आता है। यह Django को मॉडल मॉडल विरासत से अतिरेक होने से अमूर्त मॉडल फ़ील्ड को रोकने की अनुमति देता है।

मेरे बारे में सोचने के कई और कारण हैं, वे सभी अपने आप में मामूली हैं, लेकिन वे वर्तमान कार्यान्वयन को और अधिक पाइथनिक बनाने के लिए जोड़ते हैं। ऑब्जेक्ट-विरासत मिश्रणों का उपयोग करने के साथ स्वाभाविक रूप से गलत कुछ भी नहीं है।

+0

(स्वीकार किए जाते हैं जवाब के रूप में यह अंकन, हालांकि डैनियल भी अच्छा है, लेकिन अराम किरकिरा-जुओं से भरा हुआ बिट्स के बारे में अधिक थोड़ा विस्तार किया।) हूँ मैं समझ में सही कर कि, वस्तु इनहेरिट mixins का उपयोग करके मैं सक्षम हो जाएगा मॉडल पर अतिरिक्त फ़ील्ड घोषित करने के लिए? लेकिन मैं अतिरिक्त तरीकों को जोड़ने या उन्हें ओवरराइड करने में सक्षम हो जाएगा? – hopla

+0

हां, ऑब्जेक्ट-विरासत मिश्रण मिश्रित अतिरिक्त फ़ील्ड और विधियों की घोषणा कर सकते हैं। आप यह सुनिश्चित करके विधियों को ओवरराइड कर सकते हैं कि आपका ऑब्जेक्ट-विरासत मिश्रण-इन कक्षाओं की सूची में पहले से प्राप्त होता है। हालांकि, आदेश के बावजूद, एक ऑब्जेक्ट-विरासत मिश्रण एक फ़ील्ड को ओवरराइड नहीं कर सकता है (हालांकि यह करने की कोशिश करता है तो यह सत्यापित करने में विफल नहीं होगा)। –

6

कारणों में से एक मॉडल के आधार पर फ़ील्ड को परिभाषित करने के कारणों में से एक कारण है।

फ़ील्ड्स को घोषणात्मक रूप से निर्दिष्ट किया गया है, इस तरह एक सामान्य वर्ग वर्ग विशेषताओं के रूप में व्यवहार करेगा। फिर भी जब कक्षा वास्तव में तत्काल हो जाती है, तो उन्हें उदाहरण विशेषताओं बनने की आवश्यकता होती है, ताकि प्रत्येक उदाहरण के प्रत्येक फ़ील्ड के लिए अपना मूल्य हो। यह मेटाक्लास के माध्यम से प्रबंधित किया जाता है। यह एक सामान्य सार आधार वर्ग के साथ काम नहीं करेगा।

संबंधित मुद्दे