创建可序列化,可切片化对象

  创建一个可切片类

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
posted @ 2019-02-28 10:35  脱离低级趣味  阅读(264)  评论(0编辑  收藏  举报