wbzxz 发表于 2023-6-21 21:38:14

关于__getitem__魔法方法的疑问

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

               
>>> c
2
>>> c
slice(2, 8, None)

今天在学习小甲鱼老师课程的时候, 学到这里,不知道这个slice是从哪里来的,请教各位老师指点.
在类C中已经定义了__getitem__魔法方法,按里说直接调用print(index)就行,是怎么调用的,调用到slice去啦?

sfqxx 发表于 2023-6-21 21:41:11

本帖最后由 sfqxx 于 2023-6-21 21:46 编辑

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

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

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

求最佳答案。

isdkz 发表于 2023-6-21 21:42:45

你的困惑很正常,我来解释一下。

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

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

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

这也就是为什么当你打印index的时候,你看到的是slice(2, 8, None) ,这其实就是 slice 对象的字符串表示形式,告诉你这个切片操作的开始、结束以及步进值。你可以通过 slice 对象的start 、 stop和step属性来获取这些信息。
页: [1]
查看完整版本: 关于__getitem__魔法方法的疑问