स्लॉट जाने का रास्ता है:
पाइथोनिक तरीका स्लॉट्स का उपयोग करने के बजाय आसपास के साथ खेलने के लिए है __setter__
। हालांकि यह समस्या को हल कर सकता है, यह किसी भी प्रदर्शन में सुधार नहीं देता है। वस्तुओं की विशेषताओं को एक शब्दकोश " __dict__
" में संग्रहीत किया जाता है, यही कारण है कि, आप गतिशील रूप से उन कक्षाओं की वस्तुओं में विशेषताओं को जोड़ सकते हैं जो हमने अब तक बनाए हैं। विशेषता भंडारण के लिए एक शब्दकोश का उपयोग करना बहुत सुविधाजनक है, लेकिन इसका मतलब वस्तुओं के लिए जगह की बर्बादी हो सकता है, जिसमें केवल उदाहरण चर की एक छोटी राशि है।
इस अंतरिक्ष खपत समस्या के आसपास काम करने के लिए स्लॉट एक अच्छा तरीका है। गतिशील रूप से एक तानाशाही रखने के बजाय जो गतिशील रूप से वस्तुओं को जोड़ने की अनुमति देता है, स्लॉट एक स्थिर संरचना प्रदान करते हैं जो एक उदाहरण के निर्माण के बाद परिवर्धन को रोकते हैं।
जब हम एक वर्ग डिजाइन करते हैं, तो हम विशेषताओं के गतिशील निर्माण को रोकने के लिए स्लॉट का उपयोग कर सकते हैं। स्लॉट्स को परिभाषित करने के लिए, आपको नाम के साथ एक सूची को परिभाषित करना होगा __slots__
। सूची में सभी विशेषताएँ हैं, जिनका आप उपयोग करना चाहते हैं। हम इसे निम्न वर्ग में प्रदर्शित करते हैं, जिसमें स्लॉट सूची में केवल एक विशेषता "वैल" का नाम होता है।
class S(object):
__slots__ = ['val']
def __init__(self, v):
self.val = v
x = S(42)
print(x.val)
x.new = "not possible"
=> यह एक विशेषता "नया" बनाने में विफल:
42
Traceback (most recent call last):
File "slots_ex.py", line 12, in <module>
x.new = "not possible"
AttributeError: 'S' object has no attribute 'new'
NB:
- पायथन 3.3 के बाद से अंतरिक्ष की खपत का अनुकूलन करने वाला लाभ उतना प्रभावशाली नहीं है। पायथन 3.3 के साथ की-शेयरिंग डिक्शनरों का उपयोग वस्तुओं के भंडारण के लिए किया जाता है। उदाहरणों की विशेषताएं एक दूसरे के बीच उनके आंतरिक भंडारण के हिस्से को साझा करने में सक्षम हैं, अर्थात वह भाग जो कुंजी और उनके संबंधित हैश को संग्रहीत करता है। यह कार्यक्रमों की मेमोरी खपत को कम करने में मदद करता है, जो गैर-बिल्टिन प्रकारों के कई उदाहरण बनाते हैं। लेकिन फिर भी गतिशील रूप से निर्मित विशेषताओं से बचने का तरीका है।
- स्लॉट का उपयोग करना भी अपनी लागत के साथ आता है। यह क्रमबद्धता (जैसे अचार) को तोड़ देगा। यह कई विरासत को भी तोड़ देगा। एक वर्ग एक से अधिक वर्ग से वारिस नहीं हो सकता है जो या तो स्लॉट्स को परिभाषित करता है या उसके पास C कोड (जैसे सूची, टपल या इंट) में एक उदाहरण लेआउट परिभाषित है।
__setattr__
लेकिन यह संभवत: हैक किया जाएगा।