前面说过attr系列方法
1 ''' 2 item 系列方法: 3 __setitem__ ,__getitem__ ,__delitem__ 4 5 ''' 6 7 class DemoClass: 8 def __setitem__(self, key, value): 9 self.__dict__[key] = value 10 print("setitem") 11 12 def __delitem__(self, key): 13 print("delitem") 14 15 def __getitem__(self, item): 16 print("getitem") 17 18 19 if __name__ == "__main__": 20 demo = DemoClass() 21 print(demo.__dict__) 22 demo.name = "tom" # 不会调用 __setitem__ 23 print(demo.__dict__) 24 25 del demo.name #删除时不调用 __delitem__ 26 print(demo.__dict__) 27 28 #print(demo.age) #获取不存在的属性也不触发__getitem__ 29 ''' 30 输出: 31 {} 32 {'name': 'tom'} 33 {} 34 '''
上面调用属性都是用的点,下面换种方式看看:
1 class DemoClass: 2 def __setitem__(self, key, value): 3 self.__dict__[key] = value 4 print("setitem") 5 6 def __delitem__(self, key): 7 print("delitem") 8 9 def __getitem__(self, item): 10 print("getitem") 11 12 13 if __name__ == "__main__": 14 demo = DemoClass() 15 print(demo.__dict__) 16 demo['name'] = "tom" # 会调用 __setitem__ 17 print(demo.__dict__) 18 19 del demo['name'] #删除时调用 __delitem__ 20 print(demo.__dict__) 21 22 demo['age'] #获取不存在的属性 触发__getitem__ 23 ''' 24 输出: 25 {} 26 setitem 27 {'name': 'tom'} 28 delitem 29 {'name': 'tom'} 30 getitem 31 '''
这就正常了,说明对于 attr系列方法对应的是点(.) 对于item系列方法对应的是([])