# -*- coding : utf-8 -*-
# @author : gaozhigang
# @datetime : 2022/10/26 15:19
# @file : 自定义list.py
# @Software : Pycharm
import copy
# 自定义列表类 注意仅用来展示魔法函数的编程思想。实际python自带列表使用c语言编写。实际性能远高于自定义的。
class MyList(object):
# 初始化自定义列表方法,仅支持初始化可迭代对象
def __init__(self, list_obj=None):
self.i_len = -1
if list_obj is None:
list_obj = []
if not hasattr(list_obj, "__iter__"):
raise TypeError("不可初始化的对象!")
for info in list_obj:
self.i_len += 1
setattr(self, f'obj_{self.i_len}', info)
# 声明本类是可迭代对象,用于迭代。可以用for循环
def __iter__(self):
self.i = -1
return self
# 用于切片获取列表元素
def __getitem__(self, item):
if item > self.i_len or item < 0:
raise IndexError("list index out of range")
this_obj = getattr(self, f"obj_{item}")
return this_obj
# 用于迭代使用。
def __next__(self):
self.i += 1
if self.i > self.i_len:
raise StopIteration
this_obj = getattr(self, f"obj_{self.i}")
return this_obj
# 追加元素方法
def append(self, obj):
self.i_len += 1
setattr(self, f'obj_{self.i_len}', obj)
# 根据下标删除元素方法
def pop(self, item):
if item > self.i_len or item < 0:
raise IndexError("list index out of range")
s = getattr(self, f"obj_{item}")
ss = copy.deepcopy(s)
del s
for i in range(item + 1, self.i_len + 1):
s2 = getattr(self, f"obj_{i}")
setattr(self, f"obj_{i - 1}", copy.deepcopy(s2))
del s2
self.i_len -= 1
return ss
# 根据下标修改元素属性
def __setitem__(self, key, value):
if key > self.i_len or key < 0:
raise IndexError("list index out of range")
setattr(self, f"obj_{key}", value)
# 获取列表长度
def __len__(self):
return self.i_len + 1
# 打印列表所有的元素
def __str__(self):
list_str = "["
for i in range(0, self.i_len + 1):
list_str += str(getattr(self, f"obj_{i}"))
if i != self.i_len:
list_str += ","
list_str += "]"
return list_str
# 初始化自定义列表
s = MyList([0, 1, 2, 3]) # 带参初始化
s2 = MyList() # 初始化空列表
s.pop(1) # 删除小标1的元素
s.append(4) # 追加一个元素4
s[0] = 9 # 修改下标0元素为 9
# 遍历打印所有的元素
for i in s:
print(i)
# 获取列表第一个元素
print(s[0])
# 获取列表长度
print(len(s))
# 以字符串形式打印列表所有元素
print(s)
python高阶之使用魔法函数自定义列表类
于 2022-10-26 16:15:49 首次发布