__getitem__
背景
最近在看代码时,发现python中的类可以像dict一样直接取元素,这是我之前没有碰到过的。便上午查阅资料,发现原来是python类中的__getitem__
方法在作怪,寻找解决方案,并记录一下。
理解 getitem 方法
原理
通过key或index获取item的语法[]
只是语法小技巧。当你执行 a[i]
时Python调用的方法其实是a.__getitem__(i)
。
一个小举例
把类(Class)想象成是一个建筑模型。在建筑的数据中包含许多属性,包括对占据每层楼公司的描述:
class Building(object):
def __init__(self, floors):
self._floors = [None]*floors
def occupy(self, floor_number, data):
self._floors[floor_number] = data
def get_floor_data(self, floor_number):
return self._floors[floor_number]
building1 = Building(4) # Construct a building with 4 floors
building1.occupy(0, 'Reception')
building1.occupy(1, 'ABC Corp')
building1.occupy(2, 'DEF Inc')
print( building1.get_floor_data(2) )
Output:
DEF Inc
然而,我们可以使用 __getitem__
(及其对应的 __setitem__
)方法来使 Building 类的使用“更好”。
class Building(object):
def __init__(self, floors):
self._floors = [None]*floors
def __setitem__(self, floor_number, data):
self._floors[floor_number] = data
def __getitem__(self, floor_number):
return self._floors[floor_number]
building1 = Building(4) # Construct a building with 4 floors
building1[0] = 'Reception'
building1[1] = 'ABC Corp'
building1[2] = 'DEF Inc'
print( building1[2] )
Output:
DEF Inc
当然,是否需要像这样使用 __setitem__, __getitem__
取决于具体如何提取数据。 - 在上述举例中,我们将建筑物视为楼层的容器。(也可以为建筑物实现迭代器,甚至可以实现 切片 , 即一次获取多个楼层的数据 等)
参考
Understanding getitem method
A python class that acts like dict