Python类中方法getitem和getattr详解


Posted in Python onAugust 30, 2019

1、getitem 方法

使用这个方法最大的印象就是调用对象的属性可以像字典取值一样使用中括号['key']

使用中括号对对象中的属性进行取值、赋值或者删除时,会自动触发对应的__getitem__、__setitem__、__delitem__方法

代码如下:

class Foo(object):
  def __init__(self):
    self.name = 'jack'

  def __getitem__(self,item):
    if item in self.__dict__:    # item = key,判断该key是否存在对象的 __dict__ 里,
      return self.__dict__[item] # 返回该对象 __dict__ 里key对应的value

  def __setitem__(self, key, value):
    self.__dict__[key] = value   # 在对象 __dict__ 为指定的key设置value

  def __delitem__(self, key):
    del self.__dict__[key]     # 在对象 __dict__ 里删除指定的key

f1 = Foo()
print(f1['name'])  # jack
f1['age'] =10    
print(f1['age'])  # 10
del f1['name']
print(f1.__dict__) # {'age': 10}

2、getattr 方法

使用对象取值、赋值或者删除时,会默认的调用对应的__getattr__、__setattr__、__delattr__方法。

对象取值时,取值的顺序为:先从object里__getattribute__中找,第二步从对象的属性中找,第三步从当前类中找,第四步从父类中找,第五步从__getattr__中找,如果没有,直接抛出异常。

代码如下:

class Foo(object):
  def __init__(self):
    self.name = 'jack'

  def __getattr__(self, item):
    if item in self.__dict__:
      return self.__dict__[item]

  def __setattr__(self, key, value):
    self.__dict__[key] = value

  def __delattr__(self, item):
    del self.__dict__[item]

c1 = Foo()
print(c1.name) # jack
c1.age = 18
print(c1.age)  # 18
del c1.age   # 删除 对象c1的age
print(c1.age)  # None

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现哈希表
Feb 07 Python
Python使用Flask框架获取当前查询参数的方法
Mar 21 Python
Python爬取APP下载链接的实现方法
Sep 30 Python
解决python中无法自动补全代码的问题
Dec 04 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
Python爬取梨视频的示例
Jan 29 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 Python
Python字符串格式化方式
Apr 07 Python
详解Python中的for循环
Apr 30 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 Python
Python paramiko模块使用解析(实现ssh)
Aug 30 #Python
django中上传图片分页三级联动效果的实现代码
Aug 30 #Python
python实现生成Word、docx文件的方法分析
Aug 30 #Python
python解析yaml文件过程详解
Aug 30 #Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
Aug 30 #Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 #Python
python 命令行传入参数实现解析
Aug 30 #Python
You might like
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
element跨分页操作选择详解
2020/06/29 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
Python使用贪婪算法解决问题
2019/10/22 Python
python双向链表原理与实现方法详解
2019/12/03 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
如何实现jdbc性能优化
2012/07/30 面试题
美化环境标语
2014/06/20 职场文书
企业2014年度工作总结
2014/12/10 职场文书
民事撤诉申请书范本
2015/05/18 职场文书
大学生社会实践感想
2015/08/11 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis