python - पायथन वर्ग वस्तु विरासत में आता है
class object (5)
क्या
object
से उत्तराधिकारी के लिए कक्षा घोषणा के लिए कोई कारण है?
टीएल; डॉ: पायथन 3 में, पायथन 2 और 3 के बीच संगतता के अलावा, कोई कारण नहीं । पायथन 2 में, कई कारणों से ।
पायथन 2.x कहानी:
पायथन 2.x (2.2 से आगे) में बेस-क्लास के रूप में object
की उपस्थिति या अनुपस्थिति के आधार पर कक्षाओं की दो शैलियों हैं:
"क्लासिक" स्टाइल क्लासेस: उनके पास बेस क्लास के रूप में
object
नहीं है:>>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ ()
"नई" शैली कक्षाएं: उनके पास, प्रत्यक्ष या परोक्ष रूप से (उदाहरण के लिए अंतर्निहित प्रकार से उत्तराधिकारी), आधार वर्ग के रूप में
object
:>>> class NewSpam(object): # directly inherit from object ... pass >>> NewSpam.__bases__ (<type 'object'>,) >>> class IntSpam(int): # indirectly inherit from object... ... pass >>> IntSpam.__bases__ (<type 'int'>,) >>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object (<type 'object'>,)
बिना किसी संदेह के, जब एक कक्षा लिखते हैं तो आप हमेशा नए शैली के वर्गों के लिए जाना चाहेंगे। ऐसा करने के लिए बहुत कुछ हैं, उनमें से कुछ को सूचीबद्ध करने के लिए:
वर्णनकर्ताओं के लिए समर्थन । विशेष रूप से, वर्णनकर्ताओं के साथ निम्नलिखित संरचनाएं संभव हो गई हैं:
-
classmethod
: एक विधि जो कक्षा को उदाहरण के बजाय एक निहित तर्क के रूप में प्राप्त करती है। -
staticmethod
: एक विधि जो निहित तर्कself
को पहली तर्क के रूप में प्राप्त नहीं करती है। - संपत्ति वाले
property
: किसी विशेषता के प्राप्त करने, सेटिंग और हटाने के प्रबंधन के लिए फ़ंक्शंस बनाएं। -
__slots__
: कक्षा की स्मृति खपत बचाता है और इसके परिणामस्वरूप तेज़ विशेषता पहुंच भी होती है। बेशक, यह सीमाएं लगाता है ।
-
__new__
स्थैतिक विधि: आपको अनुकूलित करने देता है कि नए वर्ग के उदाहरण कैसे बनाए जाते हैं।विधि समाधान आदेश (एमआरओ) : कॉल करने के लिए कौन सी विधि को हल करने का प्रयास करते समय कक्षा के मूल वर्गों की खोज की जाएगी।
एमआरओ से संबंधित,
super
कॉल । यह भी देखें,super()
सुपर माना जाता है।
यदि आप object
से प्राप्त नहीं हैं, तो इन्हें भूल जाओ। "बुलेट" के अन्य भत्ते के साथ पिछले बुलेट बिंदुओं का एक और विस्तृत विवरण here पाया जा सकता here ।
नई शैली के वर्गों के डाउनसाइड्स में से एक यह है कि कक्षा स्वयं की मांग की अधिक स्मृति है। जब तक कि आप कई वर्ग वस्तुओं को नहीं बना रहे हैं, हालांकि, मुझे संदेह है कि यह एक मुद्दा होगा और यह सकारात्मक के समुद्र में एक नकारात्मक डूब रहा है।
पायथन 3.x कहानी:
पायथन 3 में, चीजें सरल हैं। केवल नई शैली के वर्ग मौजूद हैं (स्पष्ट रूप से कक्षाओं के रूप में संदर्भित) इसलिए, object
जोड़ने में एकमात्र अंतर आपको 8 और वर्णों में टाइप करने की आवश्यकता है। इस:
class ClassicSpam:
pass
पूरी तरह से समतुल्य है (उनके नाम के अलावा :-) इस पर:
class NewSpam(object):
pass
और इसके लिए:
class Spam():
pass
सभी के पास उनके __bases__
में object
है।
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
तो आपको क्या करना चाहिए?
पायथन 2 में: हमेशा object
स्पष्ट रूप से प्राप्त होता है । भत्ते प्राप्त करें।
पायथन 3 में: object
से प्राप्त होता object
यदि आप कोड लिख रहे हैं जो पाइथन अज्ञेयवादी होने का प्रयास करता है, यानी, इसे पाइथन 2 और पायथन 3 में दोनों काम करने की आवश्यकता है। अन्यथा नहीं, यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि पाइथन इसे इसके लिए सम्मिलित करता है आप दृश्यों के पीछे।
क्या object
से उत्तराधिकारी के लिए कक्षा घोषणा के लिए कोई कारण है?
मुझे बस कुछ कोड मिला जो ऐसा करता है और मुझे एक अच्छा कारण नहीं मिल रहा है।
class MyClass(object):
# class code follows...
यह एक नई शैली की कक्षा बनाता है।
हाँ, यह historical । इसके बिना, यह एक पुरानी शैली की कक्षा बनाता है।
यदि आप पुराने स्टाइल ऑब्जेक्ट पर type()
उपयोग करते हैं, तो आपको बस "इंस्टेंस" मिलता है। एक नई शैली की वस्तु पर आपको इसकी कक्षा मिलती है।
हां, यह एक 'नई शैली' वस्तु है। यह एक फीचर python2.2 में पेश किया गया था।
नई स्टाइल ऑब्जेक्ट्स में क्लासिक ऑब्जेक्ट्स के लिए एक अलग ऑब्जेक्ट मॉडल होता है, और कुछ चीजें पुराने स्टाइल ऑब्जेक्ट्स के साथ ठीक से काम नहीं @property
, उदाहरण के लिए, super()
, @property
और @property
। इस आलेख को एक अच्छी शैली के वर्ग के बारे में अच्छी जानकारी के लिए देखें।
मतभेदों के विवरण के लिए एसओ लिंक: पाइथन में पुरानी शैली और नई शैली कक्षाओं के बीच क्या अंतर है?
पायथन 3.x:
class MyClass(object):
= नई शैली कक्षा
class MyClass:
= नई शैली की कक्षा (वस्तु से पूरी तरह विरासत में)
पायथन 2.x:
class MyClass(object):
= नई शैली कक्षा
class MyClass:
= ओल्ड-स्टाइल क्लास
स्पष्टीकरण:
पायथन 3.x में बेस क्लास को परिभाषित करते समय, आपको ऑब्जेक्ट को परिभाषा से छोड़ने की अनुमति है। हालांकि, यह समस्या को ट्रैक करने के लिए गंभीरता से कठिन के लिए दरवाजा खोल सकता है ...
पायथन ने पाइथन 2.2 में वापस नई शैली की कक्षाएं पेश कीं, और अब तक पुरानी शैली के वर्ग वास्तव में काफी पुराने हैं। पुरानी शैली के वर्गों की चर्चा 2.x दस्तावेज़ों में दफन की गई है , और 3.x दस्तावेज़ों में मौजूद नहीं है।
समस्या यह है कि पाइथन 2.x में पुराने शैली के वर्गों के लिए सिंटैक्स पाइथन 3.x में नए स्टाइल क्लास के वैकल्पिक सिंटैक्स के समान है । पायथन 2.x अभी भी बहुत व्यापक रूप से उपयोग किया जाता है (उदाहरण के लिए जीएई, वेब 2 पीई), और किसी भी कोड (या कोडर) अनजाने में 2.x-style क्लास परिभाषाओं को 2.x कोड में ला रहा है, कुछ गंभीर रूप से पुरानी आधार वस्तुओं के साथ समाप्त हो रहा है। और क्योंकि पुराने शैली के वर्ग किसी के रडार पर नहीं हैं, इसलिए उन्हें पता नहीं चलेगा कि उन्हें क्या मारा।
तो बस इसे लंबे समय से जादू करें और कुछ 2.x डेवलपर को आँसू बचाएं।