建立可序列化,可切片化對象

  建立一個可切片類函數

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
相關文章
相關標籤/搜索