Python學習之路(43)——自定義容器(container)


Python中常見的容器類型包括dict、tuple、list和string。其中,tuple和string是不可變容器,dict和list是可變容器。其區別在於,不可變容器一旦賦值后,其元素不能進行修改。

然而,有時針對特殊需求,我們還需要自定義容易。

1、自定義不可變容器類型:需要定義__len__和__getitem__方法;

2、自定義可變容器類型:除需要定義__len__和__getitem__方法外,還需要定義__setitem__和__getitem__方法;

3、自定義的數據類型需要迭代:需要定義__iter__

4、返回自定義容器的長度:需要實現__len__(self)

5、自定義容易可以調用 self[key] , 如果key類型錯誤,拋出 TypeError ,如果無法返回 key 對應的數值時,拋出 ValueError :需要調用的是__getitem__(self, key)這個方法

6、當執行 self[key] = value 時:需要調用的是__setitem__(self, key, value)這個方法

7、當執行 del self[key]時:需要調用的是__delitem__(self, key)這個方法

8、當容器可以執行 for x in container: ,或者使用iter(container)時:需要實現__iter__(self),該方法返回的是一個迭代器

 

 

看一個例子,創建一個容器,該容器加強了內置類型list的功能,增加一些方法:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class FunctionalList:
    ''' 實現了內置類型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]

if __name__ == '__main__':
    l = FunctionalList([1,2,3,4,5,6])
    print("length:", len(l))
    print("l[2]:", l[2])
    l[2] = 33
    print("l[2]:", l[2])
    print("l.head():", l.head())
    print("l.tail():", l.tail())
    print("l.last():", l.last())
    print("l.drop(3):", l.drop(3))
    print("l.take(3):", l.take(3))

##########執行結果##########
C:\Python35\python3.exe D:/Project/Python/Pro_py3/test.py
length: 6
l[2]: 3
l[2]: 33
l.head(): 1
l.tail(): [2, 33, 4, 5, 6]
l.last(): 6
l.drop(3): [4, 5, 6]
l.take(3): [1, 2, 33]

Process finished with exit code 0

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM