python - पायथन वर्ग वस्तु विरासत में आता है




class object (5)

क्या object से उत्तराधिकारी के लिए कक्षा घोषणा के लिए कोई कारण है?

टीएल; डॉ: पायथन 3 में, पायथन 2 और 3 के बीच संगतता के अलावा, कोई कारण नहीं । पायथन 2 में, कई कारणों से

पायथन 2.x कहानी:

पायथन 2.x (2.2 से आगे) में बेस-क्लास के रूप में object की उपस्थिति या अनुपस्थिति के आधार पर कक्षाओं की दो शैलियों हैं:

  1. "क्लासिक" स्टाइल क्लासेस: उनके पास बेस क्लास के रूप में object नहीं है:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. "नई" शैली कक्षाएं: उनके पास, प्रत्यक्ष या परोक्ष रूप से (उदाहरण के लिए अंतर्निहित प्रकार से उत्तराधिकारी), आधार वर्ग के रूप में 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'>,)
    

बिना किसी संदेह के, जब एक कक्षा लिखते हैं तो आप हमेशा नए शैली के वर्गों के लिए जाना चाहेंगे। ऐसा करने के लिए बहुत कुछ हैं, उनमें से कुछ को सूचीबद्ध करने के लिए:

  • वर्णनकर्ताओं के लिए समर्थन । विशेष रूप से, वर्णनकर्ताओं के साथ निम्नलिखित संरचनाएं संभव हो गई हैं:

    1. classmethod : एक विधि जो कक्षा को उदाहरण के बजाय एक निहित तर्क के रूप में प्राप्त करती है।
    2. staticmethod : एक विधि जो निहित तर्क self को पहली तर्क के रूप में प्राप्त नहीं करती है।
    3. संपत्ति वाले property : किसी विशेषता के प्राप्त करने, सेटिंग और हटाने के प्रबंधन के लिए फ़ंक्शंस बनाएं।
    4. __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 डेवलपर को आँसू बचाएं।





inheritance