Bootstrap

Python中__getitem__ 魔法方法

在Python中,__getitem__ 是一个特殊的方法,通常称为“魔法方法”或“双下方法”(因为它们的名字前后都有两个下划线)。__getitem__ 方法允许一个对象实现像序列(如列表、元组、字符串)一样的行为,即支持使用索引操作来获取元素。
以下是 __getitem__ 方法的一些详细信息:

定义

__getitem__ 方法定义在类的内部,当对象使用索引操作符 [] 时被调用。它的基本形式如下:

def __getitem__(self, key):
    # 实现代码

其中,self 是当前对象的实例,key 是传递给 [] 操作符的索引。

用途

__getitem__ 方法的主要用途是:

  • 允许对象支持索引操作,例如 obj[key]
  • 实现切片操作,例如 obj[start:stop:step]

示例

下面是一个简单的类,它实现了 __getitem__ 方法:

class MyList:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    def __getitem__(self, index):
        return self.data[index]
my_list = MyList()
print(my_list[2])  # 输出 3

在这个例子中,MyList 类有一个 data 属性,它是一个列表。__getitem__ 方法被定义来返回 data 中对应索引的元素。

切片支持

__getitem__ 也可以用来支持切片操作:

class MyList:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    def __getitem__(self, index):
        if isinstance(index, slice):
            return [self.data[i] for i in range(*index.indices(len(self.data)))]
        else:
            return self.data[index]
my_list = MyList()
print(my_list[1:4])  # 输出 [2, 3, 4]

在这个例子中,如果 index 是一个 slice 对象(即切片操作),__getitem__ 方法将返回一个列表,其中包含指定范围内的元素。

错误处理

实现 __getitem__ 时,应当考虑错误处理,比如处理索引越界或切片参数不正确的情况:

class MyList:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    def __getitem__(self, index):
        try:
            return self.data[index]
        except IndexError:
            print("索引越界")
        except Exception as e:
            print(f"未知错误: {e}")
my_list = MyList()
print(my_list[10])  # 输出 索引越界

在这个例子中,如果索引越界,会捕获 IndexError 并打印一条消息。
__getitem__ 方法是Python数据模型的一部分,是实现自定义容器类型时非常有用的工具。通过正确地实现这个方法,可以让自定义类表现得像Python内置的序列类型一样。

;