鱼C论坛

 找回密码
 立即注册
查看: 1521|回复: 3

[已解决]关于__getitem__魔法方法的疑问

[复制链接]
发表于 2023-6-21 21:38:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> class C:
        def __getitem__(self, index):
                print(index)

                
>>> c[2]
2
>>> c[2:8]
slice(2, 8, None)

今天在学习小甲鱼老师课程的时候, 学到这里,不知道这个slice是从哪里来的,请教各位老师指点.
在类C中已经定义了__getitem__魔法方法,按里说直接调用print(index)就行,是怎么调用的,调用到slice去啦?
最佳答案
2023-6-21 21:42:45
你的困惑很正常,我来解释一下。

在Python中,slice 是一种内置类型,用于表示被切片的信息。当你使用冒号 (:) 语法进行切片操作时,Python会自动创建一个 slice 对象。这个对象包含了切片的开始、结束以及步进值(step)。

在你的例子中, c[2:8]  这个操作被 Python 解析为一个切片操作,因此 Python 会创建一个 slice 对象表示这个切片信息(从第2个元素到第8个元素,步进值默认为 None)。

当调用  c[2:8]  时,因为你的类  C  已经定义了  __getitem__  方法,这个方法会被调用,并且会接收到一个参数。由于这是一个切片操作,所以这个参数就是一个 slice 对象。

这也就是为什么当你打印  index  的时候,你看到的是  slice(2, 8, None) ,这其实就是 slice 对象的字符串表示形式,告诉你这个切片操作的开始、结束以及步进值。你可以通过 slice 对象的  start 、 stop  和  step  属性来获取这些信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-21 21:41:11 | 显示全部楼层
本帖最后由 sfqxx 于 2023-6-21 21:46 编辑

在Python中,对象(Object)可以通过方括号 [] 来进行索引操作,也就是使用下标访问元素。方括号内部可以是单个索引值,也可以是一个slice对象,表示对一段范围内的元素进行访问。例如,在一个列表 a 中,可以通过 a[2] 来获取第3个元素,也可以通过 a[2:5] 表示获取从第3个到第6个元素组成的一个新的子列表。

当我们定义一个类时,如果想要支持对象的索引操作,就需要为该类定义一个特殊的方法 getitem,也就是一个魔法方法(Magic Method)。这个方法接受一个参数,用来指定索引的位置和方式。当对象被索引时,Python会自动调用这个方法,并将相应的索引参数传递给它。

在上述代码中,我们定义了一个名为 C 的类,它包含了一个 getitem 方法。这个方法接受一个参数 index,表示索引的位置和方式,我们在这个方法中调用了 print(index) 来输出这个参数。当我们使用表达式 c[2] 时,实际上是将整数 2 作为参数传给了 c 对应的对象的 getitem 方法,从而导致 print(index) 只输出了这个整数。而当使用表达式 c[2:8] 时,实际上是将一个 slice 对象作为参数传给了 c 对应的对象的 getitem 方法,从而导致 print(index) 输出了这个 slice 对象。因此,slice 是一个Python内置的切片对象,用于表示分片操作。

求最佳答案。

点评

我很赞同!: 5.0
我很赞同!: 5
非常感谢您的指点。  发表于 2023-6-21 22:02
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2023-6-21 21:42:45 | 显示全部楼层    本楼为最佳答案   
你的困惑很正常,我来解释一下。

在Python中,slice 是一种内置类型,用于表示被切片的信息。当你使用冒号 (:) 语法进行切片操作时,Python会自动创建一个 slice 对象。这个对象包含了切片的开始、结束以及步进值(step)。

在你的例子中, c[2:8]  这个操作被 Python 解析为一个切片操作,因此 Python 会创建一个 slice 对象表示这个切片信息(从第2个元素到第8个元素,步进值默认为 None)。

当调用  c[2:8]  时,因为你的类  C  已经定义了  __getitem__  方法,这个方法会被调用,并且会接收到一个参数。由于这是一个切片操作,所以这个参数就是一个 slice 对象。

这也就是为什么当你打印  index  的时候,你看到的是  slice(2, 8, None) ,这其实就是 slice 对象的字符串表示形式,告诉你这个切片操作的开始、结束以及步进值。你可以通过 slice 对象的  start 、 stop  和  step  属性来获取这些信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 17:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表