2011-10-30 13 views
30

के साथ एक्सेस किया जा सकता है, मैं एक नई कक्षा बनाना चाहता हूं जो वस्तुओं के लिए एक विशेष प्रकार के कंटेनर के रूप में कार्य करता है, और स्क्वायर ब्रैकेट का उपयोग करके एक्सेस किया जा सकता है।एक अजगर वस्तु बनाएं जिसे स्क्वायर ब्रैकेट्स

उदाहरण के लिए, मान लें कि मेरे पास ListWrapper नामक एक कक्षा है। मान लीजिए obj एक ListWrapper है। जब मैं obj[0] कहता हूं, तो मुझे obj.access() विधि को तर्क के रूप में 0 के साथ कॉल करने की उम्मीद है। फिर, मैं जो कुछ भी चाहता हूं उसे वापस कर सकता हूं। क्या यह संभव है?

उत्तर

45

आप विशेष __getitem__[docs] विधि को परिभाषित करना चाहते हैं।

class Test(object):  
    def __getitem__(self, arg): 
     return str(arg)*3 

test = Test() 

print test[0] 
print test['kitten'] 

परिणाम:

 
000 
kittenkittenkitten 
+0

उत्कृष्ट उत्तर: ऑन-पॉइंट में, एक दस्तावेज़ लिंक और सरल कार्य-आउट उदाहरण शामिल है। –

+0

धन्यवाद! मुझे पता था कि इस विधि को पाने के लिए मुझे परिभाषित करने के लिए कुछ विधि थीं, मुझे बस यह सुनिश्चित नहीं था कि उस विधि का नाम क्या था। – Ord

+0

उम्मम्म ... "सरल काम-आउट उदाहरण" नहीं होना चाहिए, 'कुछ_expression वापस करें'? –

7

पायथन के मानक वस्तुओं __something__ नामित तरीकों जो ज्यादातर आप वस्तुओं उस भाषा में एक API में हुक बनाने के लिए अनुमति देने के लिए उपयोग किया जाता है की एक श्रृंखला है। उदाहरण के लिए __getitem__ और __setitem__ वे विधियां हैं जिन्हें [] नोटेशन के साथ मान प्राप्त करने या सेट करने के लिए कहा जाता है। पाइथन शब्दकोश के उप-वर्ग की तरह दिखने वाला कुछ उदाहरण यहां दिया गया है: https://github.com/wavetossed/mcdict

ध्यान दें कि यह वास्तव में शब्दकोश को उप-वर्गीकृत नहीं करता है और इसके पास update विधि है। यदि आप चाहते हैं कि आपकी कक्षा एक पाइथन शब्दकोश के रूप में ठीक से मास्कराइड हो, तो ये दोनों आवश्यक हैं।

संबंधित मुद्दे