2017-04-26 11 views
6

मैं पाइथन डॉक्स में __getitem__ के अधिकांश दस्तावेज और स्टैक ओवरफ्लो में भी गया हूं, इसलिए यह एक डुप्लिकेट प्रश्न नहीं है। लेकिन मैं अभी भी इसका अर्थ समझने में असमर्थ हूं।__getitem__ विधि को समझना

तो मैं समझ सकता हूं कि __getitem__self[key] जैसी कॉल लागू करने के लिए उपयोग किया जाता है। लेकिन इसका क्या उपयोग है?

चलें कहते हैं कि मैं एक अजगर वर्ग को इस तरह से परिभाषित किया गया है:

class Person: 
    def __init__(self,name,age): 
     self.name = name 
     self.age = age 

    def __getitem__(self,key): 
     print ("Inside `__getitem__` method!") 
     return getattr(self,key) 

p = Person("Subhayan",32) 
print (p["age"]) 

यह परिणाम देता है के रूप में उम्मीद। लेकिन पहली जगह __getitem__ का उपयोग क्यों करें? मैंने यह भी सुना है कि पाइथन आंतरिक रूप से __getitem__ पर कॉल करता है। लेकिन ऐसा क्यों करता है?

क्या कोई इसे अधिक विस्तार से समझा सकता है?

+0

यह एक उदाहरण के उपयोग के लिए ब्याज का हो सकता है: [सही तरीके से उपclass कैसे करें और __getitem__ और __setitem__ को ओवरराइड करें ] (http://stackoverflow.com/questions/2390827/how-to-properly-subclass-dict-and-override-getitem-setitem) – roganjosh

+0

आपके उदाहरण में '__getitem__' उपयोग बहुत समझ में नहीं आता है, लेकिन कल्पना करें कि आपको टी की जरूरत है o एक कस्टम सूची- या शब्दकोश-जैसी कक्षा लिखें, जिसे मौजूदा कोड के साथ काम करना है जो '[]' का उपयोग करता है। यह एक ऐसी स्थिति है जहां '__getitem__' उपयोगी है। –

उत्तर

7

कांग्रेस मा समझा क्या `GetItem 'के लिए प्रयोग किया जाता है का एक अच्छा काम करता है - लेकिन मैं आपको एक देना चाहता हूँ उदाहरण जो उपयोगी हो सकता है। एक ऐसी इमारत की कल्पना करें जो एक इमारत का मॉडल करे। डेटा के निर्माण के लिए यह कंपनियों के लिए जो हर मंजिल पर कब्जा के विवरण सहित विशेषताओं का एक नंबर भी शामिल है, के भीतर:

class Building(object): 
    def __init__(self, floors): 
     self._floors = [None]*floors 
    def occupy(self, floor_number, data): 
      self._floors[floor_number] = data 
    def get_floor_data(self, floor_number): 
      return self._floors[floor_number] 

building1 = Building(4) # Construct a building with 4 floors 
building1.occupy(0, 'Reception') 
building1.occupy(1, 'ABC Corp') 
building1.occupy(2, 'DEF Inc') 
print(building1.get_floor_data(2)) 

हम तथापि __getitem__ इस्तेमाल कर सकते हैं: __getitem__ का उपयोग किए बिना

हम इस तरह एक वर्ग के लिए होता है (और यह समकक्ष __setitem__ है) बिल्डिंग क्लास 'nicer' का उपयोग करने के लिए।

class Building(object): 
    def __init__(self, floors): 
     self._floors = [None]*floors 
    def __setitem__(self, floor_number, data): 
      self._floors[floor_number] = data 
    def __getitem__(self, floor_number): 
      return self._floors[floor_number] 

building1 = Building(4) # Construct a building with 4 floors 
building1[0] = 'Reception' 
building1[1] = 'ABC Corp' 
building1[2] = 'DEF Inc' 
print(building1[2]) 

चाहे आप कैसे आप सार करने के लिए आपके डेटा प्लान के __setitem__ का उपयोग की तरह यह वास्तव में निर्भर करता है - इस मामले में हम (फर्श के एक कंटेनर के रूप में एक इमारत के इलाज के लिए फैसला किया है और आप भी भवन के लिए एक इटरेटर को लागू कर सकता है , और यहां तक ​​कि टुकड़ा करने की क्षमता भी हो सकती है - यानी एक समय में एक से अधिक मंजिल के डेटा प्राप्त करें - यह निर्भर करता है कि आपको क्या चाहिए।

3

[] कुंजी या अनुक्रमणिका द्वारा आइटम प्राप्त करने के लिए वाक्यविन्यास सिर्फ वाक्यविन्यास चीनी है।

जब आप का मूल्यांकन a[i] अजगर कॉल a.__getitem__(i) (या type(a).__getitem__(a, i), लेकिन इस तरह के अंतर विरासत मॉडल के बारे में है और यहां महत्वपूर्ण नहीं है)। यहां तक ​​कि यदि a की कक्षा स्पष्ट रूप से इस विधि को परिभाषित नहीं कर सकती है, तो आमतौर पर इसे पूर्वजों वर्ग से विरासत में प्राप्त किया जाता है।

सभी (अजगर 2.7) विशेष विधि के नाम और उनके अर्थ विज्ञान यहाँ सूचीबद्ध हैं: https://docs.python.org/2.7/reference/datamodel.html#special-method-names

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