在字典和列表中我们经常使用[]来获取字典中的值或者列表中的元素,是因为字典和列表都内置了__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