2011-02-24 7 views
7

सलाह दें मेरे पास एक वर्ग है जो सूची ऑब्जेक्ट को उप-वर्गीकृत करता है। अब मुझे स्लाइसिंग को संभालने की ज़रूरत है। इंटरबेट्स पर मैंने जो भी पढ़ा है, उससे __getitem__ विधि का उपयोग करके इसे किया जाना है। कम से कम पायथन 2.7+ में जो मैं उपयोग कर रहा हूं। मैंने यह किया है (नीचे देखें), लेकिन जब मैं स्लाइस में जाता हूं तो __getitem__ विधि को कॉल नहीं किया जाता है। इसके बजाए, एक टुकड़ा किया जाता है और एक सूची लौटा दी जाती है। मुझे मेरी सूची का एक नया उदाहरण वापस आना चाहिए।पायथन स्लाइसिंग को अनुकूलित करें, कृपया

कृपया मुझे यह जानने में मदद करें कि क्या गलत है।

धन्यवाद!

class myList(list): 

    def __init__(self, items): 

     super(myList, self).__init__(items) 
     self.name = 'myList' 


    def __getitem__(self, index): 

     print("__getitem__") 
     if isinstance(index, slice): 
      print("slice") 
      return self.__class__(
       self[x] for x in range(*index.indices(len(self))) 
       ) 
     else: return super(myList, self).__getitem__(index) 

if __name__ == "__main__": 
    print("\nI'm tesing out custom slicing.\n") 

    N = 10 
    L = myList(range(N)) 

    L3 = L[3] 
    L02 = L[:2] 

उत्तर

17

this note देखें: __getitem__() विधि के लिए पैरामीटर के रूप में समर्थन टुकड़ा वस्तुओं:

object.__getslice__(self, i, j)

संस्करण 2.0 के बाद से खारिज किया गया। (हालांकि, CPython में निर्मित प्रकार वर्तमान में अभी भी __getslice__() इसलिए लागू। , आप व्युत्पन्न वर्ग में ओवरराइड कर जब टुकड़ा करने की क्रिया को लागू करने।

तो, क्योंकि आप list उपवर्ग आप ओवरराइट करना । __getslice__, भले ही यह पदावनत है

मुझे लगता है कि आप आमतौर पर उपवर्गीकरण builtins से बचना चाहिए, भी कई अजीब विवरण देखते हैं तो आप सिर्फ एक वर्ग है कि एक सूची की तरह बर्ताव चाहते हैं, वहाँ है एक ABC उस के साथ मदद करने के लिए:।

from collections import Sequence 

class MyList(Sequence): 
    def __init__(self, *items): 
     self.data = list(items) 

    def __len__(self): 
     return len(self.data) 

    def __getitem__(self, slice): 
     return self.data[slice] 

s = MyList(1,2,3) 
# lots of free methods 
print s[1:2], len(s), bool(s), s.count(3), s.index(2), iter(s)