প্লেইন ইনডেক্স এবং স্লাইসিং উভয়ই হ্যান্ডেল করার জন্য গেটাইটেম ক্লাসটি কীভাবে সংজ্ঞায়িত করবেন?
স্লাইস বস্তু স্বয়ংক্রিয়ভাবে যখন আপনি সাবস্ক্রিপ্ট স্বরলিপি একটি কোলন ব্যবহার করে নির্মিত পরার - এবং যে কি প্রেরণ করা হয় __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 এ, একটি অবহিত পদ্ধতি রয়েছে যা কিছু বিল্টিন প্রকারের সাবক্লাসিং করার সময় আপনার ওভাররাইডের প্রয়োজন হতে পারে।
থেকে datamodel ডকুমেন্টেশন :
object.__getslice__(self, i, j)
সংস্করণ ২.০ থেকে অবহেলিত:__getitem__()
পদ্ধতির পরামিতি হিসাবে স্লাইস অবজেক্টগুলিকে সমর্থন করে । (তবে সিপিথনের অন্তর্নির্মিত প্রকারগুলি বর্তমানে কার্যকর করে __getslice__()
Therefore
এটি পাইথন 3 এ চলে গেছে।
__getslice__
জন্য আপনাকে পাইথন ২ এক্স এক্স সংস্করণে প্রয়োগ করতে হবে । দেখতে docs.python.org/2/reference/datamodel.html#object.__getslice__