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中Django框架下的staticfiles使用简介
May 30 Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 Python
深入理解Python3 内置函数大全
Nov 23 Python
python opencv 直方图反向投影的方法
Feb 24 Python
python批量修改文件编码格式的方法
May 31 Python
python 处理string到hex脚本的方法
Oct 26 Python
python通过tcp发送xml报文的方法
Dec 28 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
python元组的概念知识点
Nov 19 Python
Django REST Swagger实现指定api参数
Jul 07 Python
python基础之匿名函数详解
Apr 21 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+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
python使用post提交数据到远程url的方法
2015/04/29 Python
Django中处理出错页面的方法
2015/07/15 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
python银行系统实现源码
2019/10/25 Python
python 浅谈serial与stm32通信的编码问题
2019/12/18 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
安全资料员岗位职责
2013/12/14 职场文书
中秋寄语大全
2014/04/11 职场文书
学雷锋志愿者活动方案
2014/08/21 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
超市工作总结范文2014
2014/12/19 职场文书
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电
Java实现注册登录跳转
2022/06/16 Java/Android
Fluentd搭建日志收集服务
2022/09/23 Servers