python __getitem__使用方法详解

  • Post category:Python

当我们在Python中使用类似列表、字典等可遍历对象时,常常会用到Python中的特殊方法__getitem__。那么,这个方法到底是什么?在什么情况下我们需要使用它呢?

1. 什么是 __getitem__ 方法

__getitem__是Python中的一个特殊方法,用于在访问对象中的元素时被调用。简化的来说,就像是我们在用[]操作符访问列表、字典等可遍历对象时,这个操作符就会调用__getitem__方法。所以,可以把它想象成实例对象为self的一个可调用方法。

以下是一个简单的示例,展示了如何在一个自定义类中使用__getitem__方法:

class CustomList:
    def __init__(self, lst):
        self._lst = lst

    def __getitem__(self, i):
        return self._lst[i]

lst = CustomList([1,2,3,4,5])
for i in range(5):
    print(lst[i], end=' ') # 1 2 3 4 5

上面的代码定义了一个名为CustomList的类,这个类在初始化时接受lst列表作为输入,然后在__getitem__方法中返回了lst[i],使得对于自定义类的访问对象操作也像列表的操作一样。

2. 如何使用 __getitem__ 方法

当我们需要创建一个可遍历的对象时,可以使用__getitem__方法,将对象的访问方式改为使用[]操作符。

__getitem__方法中,需要接受一个key参数,表示我们需要访问的元素所对应的关键字。这个关键字的类型可以是任何类型,按照惯例,使用整数类型作为访问列表元素的关键字。

下面通过两个示例来详细说明如何使用__getitem__方法:

(1) 在自定义类中使用 __getitem__

class CustomList:
    def __init__(self, lst):
        self._lst = lst

    def __getitem__(self, i):
        return self._lst[i]

lst = CustomList([1,2,3,4,5])
for i in range(5):
    print(lst[i], end=' ') # 1 2 3 4 5

在这个例子中,我们定义了一个名为CustomList的类,这个类在初始化时接受lst列表作为输入,将它赋值为成员变量self._lst。然后在__getitem__方法中,我们通过self._lst[i]返回了该列表中索引为i的元素。

(2) 在自定义类中实现切片

除了返回某个元素的操作,我们还可以在__getitem__方法中实现切片的操作。

下面是一个返回斐波那契数列的自定义类,我们可以使用该类的实例进行切片:

class Fibonacci:
    def __getitem__(self, i):
        if isinstance(i, int):
            if i < 0:
                raise ValueError("Index must be a positive integer!")
            a, b = 0, 1
            for _ in range(i):
                a, b = b, a + b
            return a
        elif isinstance(i, slice):
            start = i.start if i.start is not None else 0
            stop = i.stop 
            if stop is None:
                raise ValueError("End index must be specified for slicing!")
            step = i.step if i.step is not None else 1
            if step < 1:
                raise ValueError("Slicing step must be a positive integer!")
            res = []
            a, b = 0, 1
            for _ in range(stop):
                if _ >= start:
                    res.append(a)
                a, b = b, a + b
            return res[::step]

fib = Fibonacci()
print(fib[10]) # 55
print(fib[:10:2]) # [0, 1, 3, 8, 21]

在这个例子中,我们定义了一个名为Fibonacci的类,并在__getitem__方法中实现了切片的操作。当传入的关键字是一个整数时,我们返回该位置的斐波那契数列中的元素。当传入的关键字是一个slice对象时,我们根据slice对象中的startstopstep属性进行切片。这样,我们就可以在一个自定义类中实现类似列表的切片操作啦!

总结

综上所述,在Python中,我们可以利用__getitem__这个特殊方法来自定义一个类的遍历方式,使其支持[]操作符操作。该方法的主要作用是访问对象的元素,并且还可以支持切片操作。在实际应用中,我们可以结合自己的需求,灵活使用__getitem__方法来创建出符合自己需求的可遍历对象。