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实现的tab文件操作类分享
Nov 20 Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 Python
python中Switch/Case实现的示例代码
Nov 09 Python
pandas DataFrame数据转为list的方法
Apr 11 Python
Python中利用xpath解析HTML的方法
May 14 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
简单谈谈python基本数据类型
Sep 26 Python
pandas通过索引进行排序的示例
Nov 16 Python
关于django 1.10 CSRF验证失败的解决方法
Aug 31 Python
python如何通过twisted搭建socket服务
Feb 03 Python
Python‘==‘ 及 ‘is‘相关原理解析
Sep 05 Python
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
Apr 05 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
php读取mysql的简单实例
2014/01/15 PHP
php微信支付之APP支付方法
2015/03/04 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
Python高级用法总结
2018/05/26 Python
Python2包含中文报错的解决方法
2018/07/09 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
Reformation官网:美国女装品牌
2018/09/14 全球购物
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
大学生简历中个人的自我评价
2013/10/06 职场文书
画展邀请函
2015/01/31 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers