04.2 实现可切片的对象

114 阅读1分钟

代码

# 切片[start:end:step]
"""
start: 切片开始位置,默认为0
end: 切片截至位置(不包含该位置),默认列表长度 len(列表)
step: 切片的步长,默认为1
当step为负整数,表示反向切片,这时start应该比end的值大
切片会返回一个新的列表
"""
alist = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
print(alist[::])   # 返回包含原列表中所有元素的新列表       # [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
print(alist[::-1])  # 返回包含原列表中所有元素的 倒序 列表    #  [17, 15, 13, 11, 9, 7, 6, 5, 4, 3]
print(alist[::2])   # 隔step-1 取一个, 获取偶数位置的值     # [3, 5, 7, 11, 15]
print(alist[1::2])  # 从下标1开始(包含)截取 隔step -1 取一个, 获取奇数位置列表   # [4, 6, 9, 13, 17]

print(alist[3:6])   # 从下标3开始(包含)截取数据,至下标6(不包含)结束    # [6,7,9]

print(alist[0:110])     # 结束位置大于列表长度,从列表尾部截断 [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
print(alist[100:0])     # 起始位置大于列表长度,返回空列表[]


# 实现可切片对象
class Group:
    def __init__(self, group_name, company_name, staffs):
        self.group_name = group_name
        self.company_name = company_name
        self.staffs = staffs

    def __reversed__(self):
        self.staffs.reverse()
        return self.staffs

    def __getitem__(self, item):
        """实现切片对象的关键"""
        cls = type(self)
        # 判断是切片类型,当传入[start:end:step] 语法将自动初始化slice 类
        if isinstance(item, slice):
            return cls(self.group_name, self.company_name, self.staffs[item])
        elif isinstance(item, int):
            return cls(self.group_name, self.company_name, [self.staffs[item]])

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

    def __iter__(self):
        return iter(self.staffs)

    def __contains__(self, item):
            return True if item in self.staffs else False


group = Group("imooc", "user", ["1","2","3"])
print(group[0:2])   # 调用 __getitem__
print(group[1])


print("1" in group)     # 调用的是 __contains__方法

print(reversed(group))   # 调用的是 __reversed__

for i in group:     # 调用 __iter__
    print(i)

print(len(group) )     # 调用 __len__