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 相关文章推荐
flask中使用SQLAlchemy进行辅助开发的代码
Feb 10 Python
详解Python3.1版本带来的核心变化
Apr 07 Python
使用Python的Zato发送AMQP消息的教程
Apr 16 Python
python中学习K-Means和图片压缩
Nov 20 Python
Python编程实现的简单神经网络算法示例
Jan 26 Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 Python
替换python字典中的key值方法
Jul 06 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
Apr 26 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
Dec 01 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的面试题集
2006/11/19 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
ext jquery 简单比较
2010/04/07 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
Python中创建字典的几种方法总结(推荐)
2017/04/27 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
Python中文分词库jieba,pkusegwg性能准确度比较
2020/02/11 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
Ruby如何定义一个类
2012/10/08 面试题
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
护理专业毕业生自荐信范文
2014/01/05 职场文书
商场端午节活动方案
2014/01/29 职场文书
给病人的慰问信
2015/03/23 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
2022/04/07 Servers