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



Answers

घोषणा-वार:

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

class NewStyleClass(object):
    pass

class AnotherNewStyleClass(NewStyleClass):
    pass

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

class OldStyleClass():
    pass
Question

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




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

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.x कोड में उपयोगी हो सकता है:

In [3]: class A:
   ...:     def __init__(self):
   ...:         self.a = 'hi there'
   ...: 

In [4]: class B(object):
   ...:     def __init__(self):
   ...:         self.a = 'hi there'
   ...: 

In [6]: aobj = A()
In [7]: bobj = B()

In [8]: %timeit aobj.a
10000000 loops, best of 3: 78.7 ns per loop

In [10]: %timeit bobj.a
10000000 loops, best of 3: 86.9 ns per loop



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

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

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

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




Links