像dict[]一样从Class中提取元素值——__getitem__

__getitem__

  • 背景
  • 理解 __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

你可能感兴趣的:(python,python,__getitem__)