प्लेन इंडेक्स और स्लाइसिंग दोनों को संभालने के लिए गेटिटम क्लास को कैसे परिभाषित करें?
जब आप सबस्क्रिप्ट नोटेशन में एक कोलन का उपयोग करते हैं, तो स्लाइस ऑब्जेक्ट्स अपने आप बन जाते हैं - और जो पास हो जाता है __getitem__
। isinstance
यह जांचने के लिए उपयोग करें कि क्या आपके पास कोई स्लाइस ऑब्जेक्ट है:
from __future__ import print_function
class Sliceable(object):
def __getitem__(self, subscript):
if isinstance(subscript, slice):
# do your handling for a slice object:
print(subscript.start, subscript.stop, subscript.step)
else:
# Do your handling for a plain index
print(subscript)
मान लें कि हम एक रेंज ऑब्जेक्ट का उपयोग कर रहे थे, लेकिन हम चाहते हैं कि स्लाइस नई रेंज ऑब्जेक्ट्स के बजाय सूचियों को वापस लौटाए (जैसा कि यह करता है):
>>> range(1,100, 4)[::-1]
range(97, -3, -4)
हम आंतरिक सीमाओं के कारण सीमा को उप-वर्ग नहीं कर सकते, लेकिन हम इसे सौंप सकते हैं:
class Range:
"""like builtin range, but when sliced gives a list"""
__slots__ = "_range"
def __init__(self, *args):
self._range = range(*args) # takes no keyword arguments.
def __getattr__(self, name):
return getattr(self._range, name)
def __getitem__(self, subscript):
result = self._range.__getitem__(subscript)
if isinstance(subscript, slice):
return list(result)
else:
return result
r = Range(100)
हमारे पास पूरी तरह से बदली जाने वाली रेंज ऑब्जेक्ट नहीं है, लेकिन यह काफी करीब है:
>>> r[1:3]
[1, 2]
>>> r[1]
1
>>> 2 in r
True
>>> r.count(3)
1
स्लाइस नोटेशन को बेहतर ढंग से समझने के लिए, यहां स्लीसेबल का उपयोग उदाहरण दिया गया है:
>>> sliceme = Sliceable()
>>> sliceme[1]
1
>>> sliceme[2]
2
>>> sliceme[:]
None None None
>>> sliceme[1:]
1 None None
>>> sliceme[1:2]
1 2 None
>>> sliceme[1:2:3]
1 2 3
>>> sliceme[:2:3]
None 2 3
>>> sliceme[::3]
None None 3
>>> sliceme[::]
None None None
>>> sliceme[:]
None None None
अजगर 2, जागरूक रहें:
पायथन 2 में, एक पदावनत विधि है जिसे आपको कुछ अंतर्निहित प्रकारों को उप-वर्ग करते समय ओवरराइड करने की आवश्यकता हो सकती है।
से डेटामॉडल दस्तावेज़ :
object.__getslice__(self, i, j)
संस्करण 2.0 के बाद से पदावनत:__getitem__()
विधि के मापदंडों के रूप में स्लाइस ऑब्जेक्ट का समर्थन करें । (हालांकि, सीपीथॉन में निर्मित प्रकार वर्तमान में अभी भी लागू होते हैं __getslice__()
। इसलिए, आपको इसे लागू करने से पहले व्युत्पन्न वर्गों में ओवरराइड करना होगा।)
यह पायथन 3 में चला गया है।
__getslice__
अजगर 2.X संस्करणों के लिए कार्यान्वयन करना होगा । देख docs.python.org/2/reference/datamodel.html#object.__getslice__