1 '''
2 __getitem__(self, key)、__setitem__(self, key, value) 和 __delitem__(self, key) 是 Python 中的特殊方法,用于定义对对象进行索引操作时的行为。
3 它们分别用于获取、设置和删除对象中的元素
4 1. __getitem__(self, key):该方法用于通过索引或键来获取对象中的元素。应该返回与给定索引或键相关联的值。如果索引或键不存在,可以抛出 IndexError 或 KeyError 异常。
5 2. __setitem__(self, key, value):该方法用于通过索引或键来设置对象中的元素。应该根据给定的索引或键将值存储在对象中。如果索引或键不存在,可以扩展容器并添加新元素。
6 3. __delitem__(self, key):该方法用于通过索引或键来删除对象中的元素。应该根据给定的索引或键从对象中删除相应的元素。如果索引或键不存在,可以抛出 IndexError 或 KeyError 异常。
7 通过实现 __getitem__()、__setitem__() 和 __delitem__() 方法,我们可以在自定义的容器类中支持索引操作,使得对象可以像内置的容器一样进行索引访问、赋值和删除操作。
8 '''
9
10
11 class MyList:
12 def __init__(self):
13 self.data = []
14
15 def add(self, item):
16 self.data.append(item)
17
18 def __getitem__(self, index):
19 return self.data[index]
20
21 def __setitem__(self, index, value):
22 self.data[index] = value
23
24 def __delitem__(self, index):
25 del self.data[index]
26
27
28 my_list = MyList()
29 my_list.add(1)
30 my_list.add(2)
31 my_list.add(3)
32
33 '''
34 我们定义了一个名为 MyList 的自定义容器类。我们实现了 add() 方法来向容器中添加元素,并重载了 __getitem__() 方法以通过索引来获取容器中的元素。
35 当我们使用索引 my_list[0] 访问容器时,实际上会自动调用 my_list.__getitem__(0) 方法,并返回相应的结果。
36 '''
37 print(my_list[0]) # 输出:1
38
39 '''
40 实现了 __setitem__() 方法来通过索引设置容器中的元素。
41 当我们执行赋值操作 my_list[0] = 10 时,实际上会自动调用 my_list.__setitem__(0, 10) 方法,并将值 10 存储在索引为 0 的位置上
42 '''
43 my_list[0] = 10
44 print(my_list[0]) # 输出:10
45
46 '''
47 实现了 __delitem__() 方法来通过索引删除容器中的元素。
48 当我们执行删除操作 del my_list[0] 时,实际上会自动调用 my_list.__delitem__(0) 方法,并从容器中删除索引为 0 的元素。
49 '''
50 print(my_list.data) # [10, 2, 3]
51 del my_list[0] # 如果没有实现__delitem__方法,会报错: AttributeError: __delitem__
52 print(my_list[0]) # 输出:2