python高阶之使用魔法函数自定义列表类

# -*- 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值