建立一個可切片類函數
class Group(object): def __init__(self, group_name, company_name, staffs): self.goup_name = group_name self.conpany_name = company_name self.staffs = staffs def __reversed__(self): pass def __getitem__(self, item): #實現切片的關鍵魔法函數 return self.staffs[item] def __len__(self): pass def __iter__(self): pass def __contains__(self, item): pass staffs = ['frank', 'bob', 'tom', 'jerry'] group = Group(group_name='user', company_name='imocc', staffs=staffs) sub_group = group[:2] print(sub_group)
最後一行作調試以下:spa
類中由於實現了__getitem__()方法,能夠看到對類的實例group對象切片操做以後,返回list類型的sub_group(),可是若是想使得切片以後的對象的話仍是一個Group()則須要更改__getitem__()如何更改呢?咱們須要瞭解其參數item是如何傳遞進來的。3d
以(def __getitem__(self, item): #實現切片的關鍵魔法函數)行做爲調試點調試,調試
實際上傳遞的參數就是一個slice(切片)對象,同時若是將倒數第二句代碼改成sub_group = group[0]能夠經過調試看到傳遞的item就是一個整數。因而能夠完善Group()類。經過編輯__len__使之可用len()方法,經過完善__contain__使之可判斷item in Group():code
import numbers class Group(object): def __init__(self, group_name, company_name, staffs): self.goup_name = group_name self.conpany_name = company_name self.staffs = staffs def __reversed__(self): pass def __getitem__(self, item): #實現切片的關鍵魔法函數 cls = type(self) #建立一個新的Group()對象。 if isinstance(item, slice): return cls(group_name=self.goup_name, company_name=self.conpany_name, staffs=staffs[item]) if isinstance(item, numbers.Integral): return cls(group_name=self.goup_name, company_name=self.conpany_name, staffs=self.staffs[item]) def __len__(self): return len(self.staffs) def __contains__(self, item): if item in self.staffs: return True else: return False