#!/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)
實現這個效果的重要點就是魔法函式還有就是傳遞進去的列表物件