Python通过自定义类写魔法函数实现可切片的序列

该文章展示了如何在Python中创建一个自定义类`sliceObject`,使得实例可以像列表一样进行切片操作。通过实现`__getitem__`、`__iter__`、`__len__`和`__contains__`等特殊方法,实现了对对象的切片、迭代、长度计算和成员检查功能。示例代码创建了一个包含学生名字的列表,并通过`sliceObject`类进行操作。
摘要由CSDN通过智能技术生成

代码如下:

import numbers

class sliceObject:
    """
    可切片的对象
    """
    def __init__(self, students):
        self.students = students

    def __getitem__(self, item):
        """
        实现对象可切片这个魔法函数很关键
        :param item:  当传递是切片方式比如[:2]这种,item是一个slice对象,如果传递是[2]整数则是Integral对象。
        :return:
        """
        cls = type(self)  # 获取当前对象的类
        if isinstance(item, slice):  # item的不同类型返回不同的东西
            return cls(students=self.students[item])  # 同样返回可切片的对象而且是sliceObject类这个对象
        elif isinstance(item, numbers.Integral):  # 如果是整形则返回单一一个对象
            return cls(students=[self.students[item]])

    # 迭代器
    def __iter__(self):
        return iter(self.students)

    # 获取长度
    def __len__(self):
        return len(self.students)

    # 判断是否存在
    def __contains__(self, item):
        if item in self.students:
            return True
        else:
            return False


students = ["Tom", "Lucy", "Lili"]
so = sliceObject(students=students)
# 这种用法通过 __getitem__ 实现
a = so[:2]
print(a)

# 这种用法通过 __len__ 实现
print(len(so))

# 这种用法就通过 __contains__ 实现
if "Tom" in so:
    print("存在")

# 这种用法通过 __iter__ 实现
for student in so:
    print(student)
        

切片本身功能很强大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值