创建一个可切片类
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)
最后一行做调试如下:
类中因为实现了__getitem__()方法,可以看到对类的实例group对象切片操作之后,返回list类型的sub_group(),但是如果想使得切片之后的对象的话还是一个Group()则需要更改__getitem__()如何更改呢?我们需要了解其参数item是如何传递进来的。
以(def __getitem__(self, item): #实现切片的关键魔法函数)行作为调试点调试,
实际上传递的参数就是一个slice(切片)对象,同时如果将倒数第二句代码改为sub_group = group[0]可以通过调试看到传递的item就是一个整数。于是可以完善Group()类。通过编辑__len__使之可用len()方法,通过完善__contain__使之可判断item in Group():
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