python使用魔法函数创建可切片类型
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 可切片的对象 """ import numbers class sliceObject: def __init__(self, students): self.students = students def __reversed__(self): pass 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)
实现这个效果的重要点就是魔法函数还有就是传递进去的列表对象