由於時間關係,這裏以列表作爲示例,對列表進行包裝,生成自己的序列。
預計下一篇文章會對迭代器、生成器、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:今天下午,女神低頭的一瞬間,好美,那一瞬間時間都靜止了。。。。。。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
運行結果截圖
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!