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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
Python验证码识别处理实例
Dec 28 Python
Django接受前端数据的几种方法总结
Nov 04 Python
python僵尸进程产生的原因
Jul 21 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
详解python中的hashlib模块的使用
Apr 22 Python
Python动态导入模块和反射机制详解
Feb 18 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
Django接收照片储存文件的实例代码
Mar 07 Python
Django实现后台上传并显示图片功能
May 29 Python
Python中的特殊方法以及应用详解
Sep 20 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
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
js CSS操作方法集合
2008/10/31 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
JavaScript 继承 封装 多态实现及原理详解
2019/07/29 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
Python运算符重载用法实例分析
2015/06/01 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
pycharm专业版远程登录服务器的详细教程
2020/09/15 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
什么是方法的重载
2013/06/24 面试题
大学生村官典型材料
2014/01/12 职场文书
快餐店的创业计划书范文
2014/01/29 职场文书
教师节宣传方案
2014/05/23 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
2015年实习单位评语
2015/03/25 职场文书
解除合同协议书范本
2016/03/21 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
Python 中random 库的详细使用
2021/06/03 Python
Nginx 常用配置
2022/05/15 Servers
MySQL数据管理操作示例讲解
2022/12/24 MySQL