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中调用ggplot的三种方法
Apr 08 Python
Python标准模块--ContextManager上下文管理器的具体用法
Nov 27 Python
python利用rsa库做公钥解密的方法教程
Dec 10 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
详解python中__name__的意义以及作用
Aug 07 Python
python matplotlib库绘制散点图例题解析
Aug 10 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
Python tkinter布局与按钮间距设置方式
Mar 04 Python
Python tempfile模块生成临时文件和临时目录
Sep 30 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的输出:缓存并压缩动态页面
2013/06/11 PHP
php生成图片验证码
2015/06/09 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
微信小程序定位当前城市的方法
2018/07/19 Javascript
JavaScript事件对象深入详解
2018/12/30 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
基于python的汉字转GBK码实现代码
2012/02/19 Python
Python写的一个简单DNS服务器实例
2014/06/04 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
Python简易版图书管理系统
2019/08/12 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
利用 CSS3 实现的无缝轮播功能代码
2017/09/25 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
成人毕业生自我鉴定
2013/10/18 职场文书
美工的岗位职责
2013/11/14 职场文书
幼儿园感谢信
2015/01/21 职场文书
离婚协议书范文
2015/01/26 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB