python 中的魔术方法 getitem setitem
https://docs.python.org/3/reference/datamodel.html?highlight=iter#object.__getitem__
https://blog.csdn.net/weixin_42557907/article/details/81589574
class Tag:
"""
tag = Tag()
tag['name'] ---> __getitem__
"""
def __getitem__(self, item):
"""
:param item:
:return:
"""
print(f'__getitem__({item}) is called.')
return 2
def test_tag():
tag = Tag()
# __getitem__ is called
print(tag['name']) # 2
print(tag['frank']) # 2
print(tag['laoda']) # 2
if __name__ == '__main__':
test_tag()
__getitem__ 这个方法被调用的时候 是执行 tag[key]的时候,
- __setitem__
这个方法 是 怎么用呢?
当实例 instance[‘key’] =‘frank’ ,这个时候会被调用.
class Tag:
"""
tag = Tag()
tag['name'] ---> __getitem__
tag['name'] ='frank' ----> __setitem__
"""
def __getitem__(self, item):
"""
:param item:
:return:
"""
print(f'__getitem__({item}) is called.')
return self.__dict__[item]
def __setitem__(self, key, value):
print("__setitem__:Set %s Value %s" % (key, value))
self.__dict__[key] = value
if __name__ == '__main__':
tag = Tag()
# __setitem__ 被调用
tag['name'] = 'frank'
tag['laoda'] = 'liuxiaolu'
tag['laoer'] = 'lile'
tag['laosan'] = 'weiliang'
# __getitem__ 被调用
print(tag['name'])
print(tag['laoda'])
print(tag['laoer'])
print(tag['laosan'])
result:
__setitem__:Set name Value frank
__setitem__:Set laoda Value liuxiaolu
__setitem__:Set laoer Value lile
__setitem__:Set laosan Value weiliang
__getitem__(name) is called.
frank
__getitem__(laoda) is called.
liuxiaolu
__getitem__(laoer) is called.
lile
__getitem__(laosan) is called.
weiliang
- __delitem__ 这个魔术方法 是什么时候调用呢?
删除一个 实例的属性的时候
比如 说 : del tag[‘name’] 就会调用 这个方法__delitem__
class Tag:
"""
tag = Tag()
tag['name'] ---> __getitem__
tag['name'] ='frank' ----> __setitem__
del tag['name'] ----> __delitem__
"""
def __getitem__(self, item):
"""
:param item:
:return:
"""
print(f'__getitem__({item}) is called.')
return self.__dict__[item]
def __setitem__(self, key, value):
print(f"__setitem__:Set {key},Value {value}")
self.__dict__[key] = value
def __delitem__(self, key):
print(f"__delitem__({key}) is called")
del self.__dict__[key]
if __name__ == '__main__':
tag = Tag()
# __setitem__ 被调用
tag['name'] = 'frank'
tag['laoda'] = 'liuxiaolu'
tag['laoer'] = 'lile'
tag['laosan'] = 'weiliang'
# __getitem__ 被调用
print(tag['laosan'])
# __delitem__ 被调用
del tag['laosan']
try:
print(tag['laosan'])
except KeyError:
print('key error occurred.')
result:
__setitem__:Set name,Value frank
__setitem__:Set laoda,Value liuxiaolu
__setitem__:Set laoer,Value lile
__setitem__:Set laosan,Value weiliang
__getitem__(laosan) is called.
weiliang
__delitem__(laosan) is called
__getitem__(laosan) is called.
key error occurred.
总结
python 中有很多魔术方法,主要探讨了__getitem__ , __setitem__ , __delitem__
这些魔术方法的基本使用. 其实 很多时候 有一些库里会使用这些魔术方法,这个时候 要去理解他们为什么 要实现这些方法, 这个就是python 的特性了, 需要不断的学习吧.
推荐阅读有一个实现
https://github.com/requests/requests/blob/master/requests/structures.py
CaseInsensitiveDict 对大小写不敏感的字典的实现,里面就有用了这几个魔术方法.
参考文档
https://github.com/requests/requests/blob/master/requests/structures.py
https://docs.python.org/3/reference/datamodel.html?highlight=iter#object.__getitem__
https://blog.csdn.net/weixin_42557907/article/details/81589574