zoukankan      html  css  js  c++  java
  • python使用魔法函数创建可切片类型

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """
    可切片的对象
    """
    
    import numbers
    
    
    class sliceObject:
        def __init__(self, students):
            self.students = students
    
        def __reversed__(self):
            pass
    
        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)
    

    实现这个效果的重要点就是魔法函数还有就是传递进去的列表对象

  • 相关阅读:
    高亮表格行或列
    点击表格获取表格行或列索引
    文本框仅可接收decimal
    实现表格自动计算
    实现一个超简单的开关
    Nginx反向代理中proxy_set_header参数说明
    两个目录中,删除其中一个目录中同名文件的做法
    监控某个目录是否被更改
    centos下升级git版本的操作记录
    linux下core file size设置笔记
  • 原文地址:https://www.cnblogs.com/rexcheny/p/9962179.html
Copyright © 2011-2022 走看看