class Foo(object):
    def __init__(self):
        self .data={}       #创建一个空字典
    def __getitem__(self, key):
        print('__getitem__', key)
        return self .data.get(key) #效果等于 self .data[key]
    def __setitem__(self, key, value):
        print('__setitem__', key, value)
        self .data [key]=value     #把实例变成一个字典
    def __delitem__(self, key):
        print('__delitem__', key)
        del self .data [key]
obj = Foo()    #创建一个实例obj
obj['name']='JC'   #设置后就可以像字典一样赋值,调用了__setitem__函数
obj['age']=34      #obj调用age时,会自动运行__getitem__
print(obj['name'])   #调用了__getitem__,如果没有设置return的内容,则直接返回None,
                    # 其实只要没有设置retur,那么不管是name还是其他参数都一样返回NoNe
print(obj .data ['name'])    #没有设置__getitem__里面return的内容也会返回字典里面的Valu值
print(obj.data)     #打印出obj实例中存的字典{'name': 'JC', 'age': 34}
#del obj['sdfsfd']#没有设置__delitem__(self, key)下面的内容,其实就是调用了del这个函数
del obj['name']
print(obj.data)   #把'name': 'JC'删除了,返回{'age': 34}
#用于封装字典,用户访问里是访问实例对像,而不是访问字典
'''
未设置__getitem__里面return的内容
__setitem__ name JC
__setitem__ age 34
__getitem__ age
None
JC
{'name': 'JC', 'age': 34}
----------------------------------------
设置__getitem__里面return的内容
__setitem__ name JC
__setitem__ age 34
__getitem__ age
JC
JC
{'name': 'JC', 'age': 34}
'''