代码如下:
import numbers
class sliceObject:
"""
可切片的对象
"""
def __init__(self, students):
self.students = students
def __getitem__(self, item):
"""
实现对象可切片这个魔法函数很关键
:param item: 当传递是切片方式比如[:2]这种,item是一个slice对象,如果传递是[2]整数则是Integral对象。
:return:
"""
cls = type(self) # 获取当前对象的类
if isinstance(item, slice): # item的不同类型返回不同的东西
return cls(students=self.students[item]) # 同样返回可切片的对象而且是sliceObject类这个对象
elif isinstance(item, numbers.Integral): # 如果是整形则返回单一一个对象
return cls(students=[self.students[item]])
# 迭代器
def __iter__(self):
return iter(self.students)
# 获取长度
def __len__(self):
return len(self.students)
# 判断是否存在
def __contains__(self, item):
if item in self.students:
return True
else:
return False
students = ["Tom", "Lucy", "Lili"]
so = sliceObject(students=students)
# 这种用法通过 __getitem__ 实现
a = so[:2]
print(a)
# 这种用法通过 __len__ 实现
print(len(so))
# 这种用法就通过 __contains__ 实现
if "Tom" in so:
print("存在")
# 这种用法通过 __iter__ 实现
for student in so:
print(student)
切片本身功能很强大