python-定義自己的序列

由於時間關係,這裏以列表作爲示例,對列表進行包裝,生成自己的序列。
預計下一篇文章會對迭代器、生成器、range、file對象等進行詳解

# 定義自己的序列


import datetime
import pandas as pd


class MySequence(object):
    def __init__(self, sequence):
        """
        如果傳入的序列是字典,代碼還需要再完善一下。這裏先剔除字典。等後面有時間了再加進來。
        :param sequence:
        """
        # if not isinstance(sequence, (list, tuple, set, dict, pd.Series)):
        if not isinstance(sequence, (list, tuple, set, pd.Series)):
            raise TypeError("請輸入正確的序列")
        # self.__sequence = list(sequence) if isinstance(sequence, (list, tuple, set, pd.Series)) else sequence
        self.__sequence = list(sequence)
        self.__index = -1
        self.start_time = datetime.datetime.now().strftime("%F %H:%M:%S")

    def __str__(self):
        """
        實例化時,print對象名,輸出return內容
        :return:
        """
        return f"MySequence({self.__sequence})"

    def __iter__(self):
        """
        可迭代對象
        :return:
        """
        return self

    def __next__(self):
        """
        功能一:迭代器必須要有__iter__和__next__方法
        功能二:實例化後,print(list(對象名)),輸出一個列表
        :return:
        """
        self.__index += 1
        if self.__index >= self.__sequence.__len__():
            raise StopIteration
        return self.__sequence[self.__index]

    def __setitem__(self, key, value):
        self.__sequence[key] = value

    def __getitem__(self, item):
        return self.__sequence[item]

    def __delitem__(self, key):
        del self.__sequence[key]

    def __len__(self):
        return self.__sequence.__len__()

    def __sizeof__(self):
        return self.__sequence.__sizeof__()

    def __call__(self, *args, **kwargs):
        return self.__sequence

    def __del__(self):
        # print("This is a self-defined-sequence demo %s" % datetime.datetime.now().strftime("%F %H:%M:%S")
        #       )  # 報錯 ImportError: sys.meta_path is None, Python is likely shutting down
        print("This is a self-defined-sequence demo %s" % self.start_time)


if __name__ == '__main__':
    mr = MySequence([1, 2, 3, 4, 5, 6, 7])
    # 需要注意:如果註釋掉__str__,
    # (1)print(mr)不會返回列表,返回的是<__main__.MySequence object at 0x000001B038789EF0>
    # (2)print(mr[index])的切片操作可以正常輸出
    print(mr)  # __str__發揮作用  MySequence([1, 2, 3, 4, 5, 6, 7])
    print(mr())  # __call__發揮作用  [1, 2, 3, 4, 5, 6, 7]
    print(list(mr))  # __next__發揮作用  [1, 2, 3, 4, 5, 6, 7]
    del mr[1]  # 刪除操作,__delitem__發揮作用 [1, 3, 4, 5, 6, 7]
    print(mr())
    print(list(mr))  # 這裏返回空列表,是因爲迭代已停止
    mr[1] = 'My Sequence'  # 更改值操作,__setitem__發揮作用 [1, 'My Sequence', 4, 5, 6, 7]
    print(mr())
    print(mr[1])  # 切片操作,__getitem__發揮作用 My Sequence
    print(mr[1:4])  # 切片操作,__getitem__發揮作用 ['My Sequence', 4, 5]
    print(len(mr))  # __len__發揮作用(如果註釋掉__len__會報錯TypeError: object of type 'MySequence' has no len())
    
    for i in mr():  # __next__和__iter__在起作用
        print(i)

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
PS:今天下午,女神低頭的一瞬間,好美,那一瞬間時間都靜止了。。。。。。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

運行結果截圖

在這裏插入圖片描述

在這裏插入圖片描述
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章