python 魔法方法 __getitem__

在字典和列表中我们经常使用[]来获取字典中的值或者列表中的元素,是因为字典和列表都内置了__getitem方法。

"__getitem__" in (dir(list))
>>>True
"__getitem__" in (dir(dict))
>>>True

我们自定义一个类,当实例对象通过[]运算符取值时,会自动调用它的__getitem__方法

class DataBase:
    def __init__(self,id,address):
        #初始化方法
        self.id=id
        self.address=address
        self.d={self.id:1,self.address:"192.168.1.1"}

    def __getitem__(self,key):
        return self.d.get(key,"default")


data=DataBase(1,"192.168.1.1")
print(data['hi'])
>>>"default"   #data.d中无 “hi”键, 返回 “default”

print(data[data.id])
>>>1
print(data[data.address])
>>>"192.168.1.1"

序列可以迭代,即 for i in P

内置方法__getitem__(self, index)同样可以实现对象迭代(从索引0开始)。

class DataBase:
    def __init__(self,id,address):
        #初始化方法
        self.id=id
        self.address=address
        self.d={self.id:1,self.address:"192.168.1.1"}

    def __getitem__(self,key):
        assert key < 10  

        print(key)  #打印索引值
        return self.d.get(key,"default")  #返回字典value,默认为default


data=DataBase(1,"192.168.1.1")
for i in data:
    print(i)

>>>0
   default
   1
   1     # 字典中含有key1, 输出value1 
   2
   default
   3
   default
   4
   default
   5
   default
   6
   default
   7
   default
   8
   default
   9
       default

 实现__iter__和__next__同样的效果

i_data = iter(data)
next(i_data)
>>>0
   default

 

posted @ 2020-10-15 22:47  learningcaiji  阅读(1530)  评论(0编辑  收藏  举报