2008-12-01 16 views
36

में कक्षा foo और class foo (ऑब्जेक्ट) के बीच अंतर मुझे पता है class foo(object) कक्षा को परिभाषित करने का एक पुराना स्कूल तरीका है। लेकिन मैं इन दोनों के बीच अंतर को और अधिक विस्तार से समझना चाहता हूं।पायथन

+0

पाइथन का कौन सा संस्करण आप उपयोग कर रहे हैं। 2.6/3.0 पीओवी से, यह एक बात है। 2.5 (और पिछले) संस्करणों से, यह अलग है। आप अभी किसका उपयोग कर रहे हैं? –

+1

संभावित डुप्लिकेट [पाइथन में पुरानी शैली और नई शैली कक्षाओं के बीच क्या अंतर है?] (Http: // stackoverflow।कॉम/प्रश्न/54867/पुराने-स्टाइल-एंड-न्यू-स्टाइल-क्लास-इन-पायथन के बीच-अंतर-अंतर-अंतर) – vaultah

+0

@ वेंडी ऐसा लगता है कि अब आपके पास इसे कम करने के लिए कुछ सालों हैं , तो क्या आप इस प्रश्न का उत्तर चुन सकते हैं। ऐसा लगता है कि समुदाय ने सुझाव दिया है। ;-) – Zak

उत्तर

11

class foo(object): कक्षाओं की घोषणा का 'नया' तरीका है।

यह परिवर्तन पायथन 2.2 में बनाया गया था, मतभेदों के this PEP for an explanation देखें।

+3

"नई शैली की कक्षाओं को घोषित करने का तरीका" कहना अधिक सटीक होगा। बीटीडब्लू, पायथन 3.0 "कक्षा फू:" से शुरू होने वाला एक नया स्टाइल क्लास है। –

4

उपclassing object एक नई शैली की कक्षा पैदा करता है। नई शैली कक्षाओं के दो प्रसिद्ध लाभ हैं:

  • Metaclasses (वर्ग की तरह कारखानों, लेकिन पारदर्शी रूप से काम करता है)
  • गुण (getters & setters ...)
+1

असल में, मेटाक्लास भी पुराने स्टाइल कक्षाओं के लिए काम करेगा। कुछ संपत्ति कार्यक्षमता भी काम करेगी (गेटर्स, लेकिन सेटर्स नहीं) – Brian

38

वहाँ 2.2 अजगर से पहले अनिवार्य रूप से कक्षा के दो अलग-अलग प्रकार थे: सी एक्सटेंशन और सी कोडित बिल्टिन (प्रकार) और पाइथन क्लास स्टेटमेंट्स (कक्षाओं) द्वारा परिभाषित किए गए लोगों द्वारा परिभाषित किया गया था। इससे आपको समस्याएं उत्पन्न हुईं जब आप पाइथन-प्रकार और बिल्टिन प्रकारों को मिश्रित करना चाहते थे। इसके लिए सबसे आम कारण subclassing है। यदि आप पाइथन कोड में सूची प्रकार को उप-वर्ग करना चाहते हैं, तो आप भाग्य से बाहर थे, और इसके बजाय विभिन्न वर्कअराउंड का उपयोग किया गया था, जैसे सूचियों के शुद्ध पायथन कार्यान्वयन (उपयोगकर्ता सूची मॉड्यूल में) को उपclassing।

यह काफी बदसूरत था, इसलिए 2.2 में move था जो कि उनके द्वारा inherit की क्षमता सहित पाइथन और बिल्टिन प्रकारों को एकीकृत करने के लिए था। परिणाम "नई शैली कक्षाएं" है। हालांकि, पुराने-पुराने वर्गों में इन असंगत मतभेद हैं, इसलिए पिछड़े संगतता के लिए, नंगे वर्ग वाक्यविन्यास एक पुरानी शैली की कक्षा बनाता है, जबकि नया व्यवहार ऑब्जेक्ट से विरासत में प्राप्त होता है। सबसे दृश्यमान व्यवहार अंतर हैं:

  • विधि समाधान आदेश (एमआरओ)। हीरे के आकार के विरासत पदानुक्रमों में व्यवहार में एक अंतर है (जहां बी और सी दोनों से विरासत प्राप्त होती है, जो दोनों एक सामान्य आधार वर्ग डी से प्राप्त होते हैं। पहले, विधियों को बाएं से दाएं, गहराई पहले (यानी एबीडीसीडी) देखा जाता था हालांकि यदि सी डी के सदस्य को अधिभारित करता है, तो इसका उपयोग ए द्वारा नहीं किया जाएगा (क्योंकि यह पहले डी के कार्यान्वयन को पाता है) यह प्रोग्रामिंग की विभिन्न शैलियों (उदाहरण के लिए। मिक्स्न कक्षाओं का उपयोग करके) के लिए बुरा है। नई शैली कक्षाएं इस स्थिति को एबीसीडी के रूप में मानेंगी,

  • __new__ निर्माता जोड़ा जाता है, जो कक्षा एक कारखाने विधि के रूप में कार्य करने के बजाय वर्ग का एक नया उदाहरण लौटने की अनुमति देता है (ताकि इसे खोज करेंगे देखने के लिए एक वर्ग के __mro__ विशेषता को देखो)। उपयोगी विशेष उप-वर्गों को वापस करने के लिए, या सृजन को बदलने के बिना नए बनाने के बजाय अपरिवर्तनीय वस्तुओं का पुन: उपयोग करना terface।

  • Descriptors। गुणों, कक्षाओं, staticmethods आदि जैसी चीजों के पीछे ये विशेषताएं हैं। अनिवार्य रूप से, जब आप किसी नई शैली (विशेष शैली) वर्ग पर किसी विशेष विशेषता को एक्सेस करते हैं या सेट करते हैं तो यह नियंत्रित करने का एक तरीका प्रदान करता है।