मनमाने ढंग से विशेषता असाइनमेंट का समर्थन करने के लिए, एक वस्तु की जरूरत है __dict__
: एक वस्तु से जुड़ा एक तानाशाह, जहां मनमाना विशेषताओं को संग्रहीत किया जा सकता है। अन्यथा, नई विशेषताओं को रखने के लिए कहीं नहीं है ।
का एक उदाहरण object
है नहीं चारों ओर ले जाने के लिए एक __dict__
- अगर यह किया था, भयानक परिपत्र निर्भरता समस्या (पहले के बाद से dict
, और सबसे सब कुछ की तरह, से विरासत में मिली object
;-), इस काठी होगा हर एक dict साथ अजगर में वस्तु है, जो एक ओवरहेड का मतलब होगा के कई उद्देश्य यह है कि वर्तमान में नहीं है या एक dict जरूरत प्रति बाइट्स (अनिवार्य रूप से सभी वस्तुओं की जरूरत नहीं है कि मनमाने ढंग से आबंटित गुण नहीं है या एक dict की जरूरत है)।
उदाहरण के लिए, उत्कृष्ट pympler
परियोजना का उपयोग करके (आप इसे यहाँ से svn के माध्यम से प्राप्त कर सकते हैं ), हम कुछ माप कर सकते हैं ...
>>> from pympler import asizeof
>>> asizeof.asizeof({})
144
>>> asizeof.asizeof(23)
16
आप हर एक int
को सिर्फ 16 के बजाय 144 बाइट नहीं लेना चाहेंगे , सही? -
अब, जब आप एक वर्ग बनाते हैं (जो कुछ भी विरासत में मिलता है), चीजें बदल जाती हैं ...:
>>> class dint(int): pass
...
>>> asizeof.asizeof(dint(23))
184
... __dict__
है अब जोड़ा (प्लस, एक छोटे से अधिक भूमि के ऊपर) - तो एक dint
उदाहरण मनमाना गुण हो सकता है, लेकिन आप उस लचीलेपन के लिए काफी जगह लागत का भुगतान।
तो क्या हुआ अगर आप int
सिर्फ एक अतिरिक्त विशेषता के साथ चाहते थे foobar
...? यह एक दुर्लभ जरूरत है, लेकिन पायथन उद्देश्य के लिए एक विशेष तंत्र प्रदान करता है ...
>>> class fint(int):
... __slots__ = 'foobar',
... def __init__(self, x): self.foobar=x+100
...
>>> asizeof.asizeof(fint(23))
80
... काफी नहीं के रूप में एक छोटे int
, तुम मन! (या यहां तक कि दो int
एस, एक self
और एक self.foobar
- दूसरे को फिर से असाइन किया जा सकता है), लेकिन निश्चित रूप से एक से बेहतर है dint
।
जब वर्ग में __slots__
विशेष गुण (तार का एक क्रम) होता है, तो class
कथन (अधिक सटीक रूप से, डिफ़ॉल्ट मेटाक्लास type
) उस वर्ग के प्रत्येक उदाहरण को (और इसलिए मनमाने गुण रखने की क्षमता ) से लैस नहीं करता है __dict__
, बस एक परिमित , "स्लॉट्स" का कठोर सेट (मूल रूप से वे स्थान जो प्रत्येक दिए गए नामों के साथ किसी वस्तु का एक संदर्भ रख सकते हैं)।
खोए हुए लचीलेपन के बदले में, आप प्रति उदाहरण बहुत अधिक बाइट्स प्राप्त करते हैं (संभवतः केवल तभी सार्थक हो जब आपके पास आसपास के उदाहरण हैं, लेकिन, उसके लिए उपयोग के मामले हैं )।
object
प्रकार अपरिवर्तनीय है और नई विशेषताओं को नहीं जोड़ा जा सकता है? ऐसा लगता है कि यह सबसे अधिक समझ में आता है।