python - पाइथन में पुरानी शैली और नई शैली कक्षाओं के बीच क्या अंतर है?




class oop (6)

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

पायथन 3 में केवल नई शैली की कक्षा है, भले ही आप 'पुरानी शैली की कक्षा' लिखते हैं, यह स्पष्ट रूप से object से प्राप्त होता object

नई शैली के वर्गों में पुरानी शैली के वर्गों, जैसे कि super और नए सी 3 एमआरओ , कुछ जादुई तरीकों इत्यादि जैसी कुछ उन्नत विशेषताएं हैं।

पाइथन में पुरानी शैली और नई शैली कक्षाओं के बीच क्या अंतर है? क्या इन दिनों पुरानी शैली के वर्गों का उपयोग करने का कोई कारण है?


नई शैली कक्षाएं super(Foo, self) उपयोग कर सकती हैं जहां Foo एक वर्ग है और self उदाहरण है।

super(type[, object-or-type])

एक प्रॉक्सी ऑब्जेक्ट लौटाएं जो कि माता-पिता या भाई-बहन वर्ग के लिए विधि कॉल को प्रतिनिधि करता है। यह विरासत में प्राप्त विधियों तक पहुंचने के लिए उपयोगी है जो कक्षा में ओवरराइड किए गए हैं। खोज आदेश वही है जो getattr () द्वारा उपयोग किया जाता है सिवाय इसके कि प्रकार स्वयं छोड़ दिया जाता है।

और पायथन 3.x में आप बिना किसी पैरामीटर के कक्षा के अंदर super() उपयोग कर सकते हैं।


यहां एक बहुत ही व्यावहारिक, सही / गलत अंतर है। निम्नलिखित कोड के दो संस्करणों के बीच एकमात्र अंतर यह है कि दूसरे संस्करण में व्यक्ति वस्तु से प्राप्त होता है। इसके अलावा दो संस्करण समान हैं, लेकिन विभिन्न परिणामों के साथ:

1) पुरानी शैली के वर्ग

class Person():
    _names_cache = {}
    def __init__(self,name):
        self.name = name
    def __new__(cls,name):
        return cls._names_cache.setdefault(name,object.__new__(cls,name))

ahmed1 = Person("Ahmed")
ahmed2 = Person("Ahmed")
print ahmed1 is ahmed2
print ahmed1
print ahmed2


>>> False
<__main__.Person instance at 0xb74acf8c>
<__main__.Person instance at 0xb74ac6cc>
>>>

2) नई शैली कक्षाएं

class Person(object):
    _names_cache = {}
    def __init__(self,name):
        self.name = name
    def __new__(cls,name):
        return cls._names_cache.setdefault(name,object.__new__(cls,name))

ahmed1 = Person("Ahmed")
ahmed2 = Person("Ahmed")
print ahmed2 is ahmed1
print ahmed1
print ahmed2

>>> True
<__main__.Person object at 0xb74ac66c>
<__main__.Person object at 0xb74ac66c>
>>>

या इसके बजाय, आपको हमेशा नए-शैली के वर्गों का उपयोग करना चाहिए, जब तक कि आपके पास कोड हो जो 2.2 से पुरानी पायथन के संस्करणों के साथ काम करने की आवश्यकता हो।


http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes :

पायथन 2.1 तक, पुराने शैली के वर्ग उपयोगकर्ता के लिए एकमात्र स्वाद उपलब्ध थे। (पुरानी शैली) वर्ग की अवधारणा प्रकार की अवधारणा से असंबंधित नहीं है: यदि x पुरानी शैली की कक्षा का एक उदाहरण है, तो x.__class__ की श्रेणी को निर्दिष्ट करता है, लेकिन type(x) हमेशा <type 'instance'> । यह इस तथ्य को प्रतिबिंबित करता है कि स्वतंत्र रूप से उनकी कक्षा के सभी पुराने शैली के उदाहरणों को एक अंतर्निर्मित प्रकार के साथ कार्यान्वित किया जाता है, जिसे आवृत्ति कहा जाता है।

कक्षा और प्रकार की अवधारणाओं को एकजुट करने के लिए पायथन 2.2 में नई शैली की कक्षाएं पेश की गईं । एक नई शैली की कक्षा बस उपयोगकर्ता द्वारा परिभाषित प्रकार है, और नहीं, कम नहीं। यदि एक्स एक नई शैली के वर्ग का उदाहरण है, तो type(x) आमतौर पर x.__class__ के समान x.__class__ (हालांकि इसकी गारंटी नहीं है - x.__class__ लिए लौटाए गए मान को ओवरराइड करने के लिए एक नए-शैली वर्ग उदाहरण की अनुमति है) ।

नई शैली के वर्गों को शुरू करने के लिए प्रमुख प्रेरणा एक पूर्ण मेटा मॉडल के साथ एक एकीकृत ऑब्जेक्ट मॉडल प्रदान करना है । इसमें कई अंतर्निहित लाभ भी हैं, जैसे अधिकांश अंतर्निर्मित प्रकारों को उपclass करने की क्षमता, या "वर्णनकर्ता" की शुरूआत, जो गणना गुणों को सक्षम करती है।

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

पायथन 3 में केवल नई शैली के वर्ग हैं । कोई फर्क नहीं पड़ता कि आप object से उप-वर्ग हैं या नहीं, कक्षाएं पाइथन 3 में नई शैली हैं।


घोषणा-वार:

नई शैली के वर्ग वस्तु से, या किसी अन्य नई शैली के वर्ग से प्राप्त होते हैं।

class NewStyleClass(object):
    pass

class AnotherNewStyleClass(NewStyleClass):
    pass

पुराने शैली के वर्ग नहीं करते हैं।

class OldStyleClass():
    pass




new-style-class