Python Basic - 特殊方法-使用__getitem__()进行slice 列表切片的原理

回顾列表切片

listslice = [1,2,3,4,5,6,7,8,9,0]

print(listslice[1])
print(listslice[2:6])
print(listslice[2:6:2])

"""
2
[3, 4, 5, 6]
[3, 5]
"""

如上所示,列表中的数据可以通过下标的方式进行查找,可以查找指定下标范围内的数据,并且可以指定步进长度。

列表切片是如何实现的

列表切片在python3还是使用的getitem方法,所以在getitem方法里面还需要其它处理。要通过什么判断呢?
在“ __getitem__(self, item)”示例时,在只get一个数字的时候,返回值为整型,但是如果是由3个冒号分开的就不是整形了。

class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __getitem__(self, item):
        print(item,type(item))
        return item

obj = Foo("Elon Musk",38)
obj[100]
obj[100:110:2]
"""
100 <class 'int'>
slice(100, 110, 2) <class 'slice'>
"""

可以看到,如果只是1个值,类型为“int”整型的,但是如果是用冒号隔开的3个值,则类型为“slice”切片型
其实相当于将这3个值封封装到一个对象里边了,然后将对象当成参数传入进类里边。

判断类型,指定操作

class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __getitem__(self, item):
        if type(item) == slice:
            print("为切片类型,需要切片处理")
        else:
            print("非切片类型,直接下标索引处理")


obj = Foo("Elon Musk",38)
obj[100]
obj[100:110:2]
"""
非切片类型,直接下标索引处理
为切片类型,需要切片处理
"""

slice的类型的源码分析

class slice(object):
    """
    slice(stop)
    slice(start, stop[, step])
    
    Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
    """
   ......省略......省略......省略......省略......省略......省略......省略......省略......省略......

    start = property(lambda self: 0)
    """:type: int"""

    step = property(lambda self: 0)
    """:type: int"""

    stop = property(lambda self: 0)
    """:type: int"""


    __hash__ = None

别的先不看,单看这个类是用于3个属性“start,step,stop”来定位切片的开始,结束与步进长度

使用__getitem__()实现切片的思路

class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __getitem__(self, item):
        if type(item) == slice:
            print("为切片类型,需要切片处理")
            print(item.start)
            print(item.stop)
            print(item.step)
        else:
            print(item.start)
            print(item.stop)
            print(item.step)
            print("非切片类型,直接下标索引处理")

class Slice:
    def __init__(self,start,stop,step):
        self.start = start
        self.stop = stop
        self.step = step

obj = Slice(1,4,2)

obj1 = Foo("Elon Musk",38)
obj1[obj]


"""
1
4
2
非切片类型,直接下标索引处理
"""

更高级的玩法可以展开思路继续写

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值