亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

自定義容器(Container)

經(jīng)過之前編章的介紹,我們知道在 Python 中,常見的容器類型有: dict, tuple, list, string。其中也提到過可容器和不可變?nèi)萜鞯母拍?。其?tuple, string 是不可變?nèi)萜鳎琩ict, list 是可變?nèi)萜鳌?可變?nèi)萜骱筒豢勺內(nèi)萜鞯膮^(qū)別在于,不可變?nèi)萜饕坏┵x值后,不可對其中的某個元素進(jìn)行修改。當(dāng)然具體的介紹,可以看回之前的文章,有圖文介紹。

那么這里先提出一個問題,這些數(shù)據(jù)結(jié)構(gòu)就夠我們開發(fā)使用嗎?不夠的時候,或者說有些特殊的需求不能單單只使用這些基本的容器解決的時候,該怎么辦呢?

這個時候就需要自定義容器了,那么具體我們該怎么做呢?

功能說明
自定義不可變?nèi)萜黝愋?/td>需要定義 __len__ 和 __getitem__ 方法
自定義可變類型容器在不可變?nèi)萜黝愋偷幕A(chǔ)上增加定義 __setitem__ 和 __delitem__
自定義的數(shù)據(jù)類型需要迭代需定義 __iter__
返回自定義容器的長度需實(shí)現(xiàn) __len__(self)
自定義容器可以調(diào)用 self[key] ,如果 key 類型錯誤,拋出TypeError ,如果沒法返回key對應(yīng)的數(shù)值時,該方法應(yīng)該拋出ValueError?需要實(shí)現(xiàn) __getitem__(self, key)
當(dāng)執(zhí)行 self[key] = value 時調(diào)用是 __setitem__(self, key, value)這個方法
當(dāng)執(zhí)行 del self[key] 方法其實(shí)調(diào)用的方法是 __delitem__(self, key)
當(dāng)你想你的容器可以執(zhí)行 for x in container: 或者使用 iter(container) 時需要實(shí)現(xiàn) __iter__(self) ,該方法返回的是一個迭代器

來看一下使用上面魔術(shù)方法實(shí)現(xiàn) Haskell 語言中的一個數(shù)據(jù)結(jié)構(gòu):

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class FunctionalList:
    ''' 實(shí)現(xiàn)了內(nèi)置類型list的功能,并豐富了一些其他方法: head, tail, init, last, drop, take'''
    def __init__(self, values=None):
        if values is None:
            self.values = []
        else:
            self.values = values
    def __len__(self):
        return len(self.values)
    def __getitem__(self, key):
        return self.values[key]
    def __setitem__(self, key, value):
        self.values[key] = value
    def __delitem__(self, key):
        del self.values[key]
    def __iter__(self):
        return iter(self.values)
    def __reversed__(self):
        return FunctionalList(reversed(self.values))
    def append(self, value):
        self.values.append(value)
    def head(self):
        # 獲取第一個元素
        return self.values[0]
    def tail(self):
        # 獲取第一個元素之后的所有元素
        return self.values[1:]
    def init(self):
        # 獲取最后一個元素之前的所有元素
        return self.values[:-1]
    def last(self):
        # 獲取最后一個元素
        return self.values[-1]
    def drop(self, n):
        # 獲取所有元素,除了前N個
        return self.values[n:]
    def take(self, n):
        # 獲取前N個元素
        return self.values[:n]


繼續(xù)學(xué)習(xí)
||
提交重置代碼