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 2def test_tag():tag = Tag()# __getitem__ is calledprint(tag['name'])  # 2print(tag['frank'])  # 2print(tag['laoda'])  # 2if __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] = valueif __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] = valuedef __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

分享快乐,留住感动. 2018-12-30 19:30:39 --frank

python 中的魔术方法 getitem setitem相关推荐

  1. python中的魔术方法

    魔术方法 魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发. 1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发 ...

  2. Python中的魔术方法详解

    介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",中文称『魔术方法』,例如类的初始化方法 __init__ ,P ...

  3. Python 中的魔术方法(双下划线开头和结尾的方法)

    https://gitbook.cn/books/5ffd564919f81e0b10c9e39f/index.html https://www.cnblogs.com/pyxiaomangshe/p ...

  4. 详细介绍Python中的“魔术方法“__XXX___; 概述__str__()方法;__new__()方法; 三. __ new__ 和__init__的区别

    概述 一.__str__方法 当不用__str__()时: 发现输出结果只有对象一串id地址信息; 当我们想打印出更多信息时,用__str__()方法; 二.new()方法 三. __ new__ 和 ...

  5. Python3中的魔术方法汇总

    欢迎访问个人网络日志网站,获取最新文章! (二)Python中的魔术方法 1.魔术方法简介 Python 中的魔术方法(Magic)方法,是那些被__包围的方法,在对象继承时,子类可以重写父类的魔术方 ...

  6. python中的魔方方法

    python中的魔方方法 魔法方法 含义 基本的魔法方法 new(cls[, -]) 1. new 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 ...

  7. python 析构函数_常用的python类的魔术方法

    对于很少使用python编写大型代码的朋友可能会忘记python还是一种面向对象的语言.在其他面向对象的语言中有构造函数.析构函数等等在生命周期不同时机自动调用的函数,python当然也是有的.除此之 ...

  8. python描述符魔术方法_Python类型转换的魔术方法详解

    本文讨论python中将某个复杂对象转换为简单对象或数据类型的常用魔术放啊,这些在编程中是十分有用的. 1.__str__方法. 在讲解本方法前我们先打开一个jupyter notebook,随意创建 ...

  9. python中的魔法方法__new___Python魔法方法会调用new方法吗?

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明:一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修 ...

最新文章

  1. timestomping 修改文件时间戳
  2. 全球及中国衣柜香氛市场投资份额与营销潜力研究报告2022版
  3. 使用literal语法格式化字符串
  4. ABAP Development Tool如何配置代码自动完成的快捷键
  5. P1217 [USACO1.5]回文质数 Prime Palindromes(技巧+暴力枚举+线性筛)
  6. docker-machine 下载iso慢的问题
  7. 分享一篇获取键盘数值的js(限制在IE浏览器)
  8. Python环境搭建及PyCharm下载安装
  9. 管理感悟:给自己编程水平打分
  10. 怎么利用计算机计算潮流计算,计算机潮流计算.ppt
  11. js根据经纬度计算距离
  12. QFont所有支持字体
  13. 清卡时提示“增值税未申报或未比对”
  14. Pandas数据分析(十年期国债收益率 与 十年期国债期货价格的相关性)
  15. abandon connection, owner thread: DubboServerHandler错误原因
  16. CANopen协议及应用
  17. 自己写的PDF转JPG的程序
  18. 分词器以及ik中文分词器
  19. 检测浏览器无痕模式下是否支持localStorage
  20. SQL Server(MSSQLSERVER)无法启动问题解决

热门文章

  1. Xcode大纲视图中的项目为灰色
  2. Macbook 解决跨域的问题
  3. 解决chrome浏览器跨域问题
  4. Mybatis模糊查询
  5. 【汇编语言】8086汇编字符串定义为何使用DB?其他数据类型不可以吗?(20200515复盘)
  6. 刑侦,考古,运维,程序员
  7. uml时序图的初印象-------Day64
  8. Android 11 显示状态与背光亮度调整
  9. Mysql计算datetime时间差UNIX_TIMESTAMP
  10. 【AT91SAM7X-EK开发板】芯片的加密与解除加密