python 中的魔術方法 getitem setitem
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