मनमाने ढंग से विशेषता असाइनमेंट का समर्थन करने के लिए, किसी ऑब्जेक्ट को __dict__
की आवश्यकता होती है: ऑब्जेक्ट से जुड़े एक तीर, जहां मनमाने ढंग से गुण संग्रहीत किए जा सकते हैं। अन्यथा, कहीं भी नई विशेषताएं डालें। (dict
के बाद से ही यह किया था, भयानक परिपत्र निर्भरता समस्या से पहले, और सबसे सब कुछ की तरह, object
से विरासत ;-), इस हर काठी होगा -
object
का एक उदाहरण करता एक __dict__
आसपास नहीं कैरी पाइथन में ऑब्जेक्ट के साथ ऑब्जेक्ट, जिसका मतलब का एक ओवरहेड होगा, जो बाइट्स प्रति ऑब्जेक्ट है, जिसमें वर्तमान में कोई हथियार नहीं है या आवश्यक है (अनिवार्य रूप से, उन सभी ऑब्जेक्ट्स जिनमें मनमाने ढंग से असाइन करने योग्य गुण नहीं हैं, उन्हें एक निर्देश या आवश्यकता नहीं है)।
उदाहरण के लिए, उत्कृष्ट pympler
परियोजना का उपयोग कर, हम कुछ माप कर सकते हैं (यदि आप इसे here से SVN के माध्यम से प्राप्त कर सकते हैं) ...:
>>> from pympler import asizeof
>>> asizeof.asizeof({})
144
>>> asizeof.asizeof(23)
16
आप 144 को लेने के लिए हर int
नहीं चाहता है, है ना सिर्फ 16 साल की बजाय बाइट्स -)
अब, जब आप चीजों को बदलना एक वर्ग (जो भी से इनहेरिट) बनाने के लिए, ...:
>>> 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
बयान (अधिक सटीक, डिफ़ॉल्ट metaclass, type
) नहीं एक __dict__
साथ उस वर्ग के प्रत्येक उदाहरण से लैस होते हैं (और इसलिए मनमानी विशेषताओं की क्षमता), दिए गए नामों के साथ "स्लॉट" (मूल रूप से वे स्थान जो प्रत्येक वस्तु के संदर्भ में हो सकते हैं) का एक सीमित, कठोर सेट।
खो लचीलेपन के लिए विदेशी मुद्रा में, आप उदाहरण के प्रति बाइट्स का एक बहुत लाभ (शायद सार्थक केवल यदि आप उदाहरणों के आसपास gallivanting के zillions है, लेकिन, वहाँ कि के लिए उपयोग के मामलों रहे हैं)।
शुद्ध अनुमान: 'ऑब्जेक्ट' प्रकार अपरिवर्तनीय है और नए गुण जोड़े नहीं जा सकते हैं? ऐसा लगता है कि यह सबसे ज्यादा समझ में आता है। –
@ एसएलॉट: इस प्रश्न की पहली पंक्ति देखें। शुद्ध जिज्ञासा। – Smashery
आपका शीर्षक भ्रामक है, आप 'ऑब्जेक्ट' वर्ग पर नहीं, 'ऑब्जेक्ट' क्लास उदाहरणों पर विशेषताओं को सेट करने का प्रयास कर रहे हैं। – dhill