python中hasattr()、getattr()、setattr()函数的使用


Posted in Python onAugust 16, 2019

 引言:

在阅读源码时,有很多简写的形式,其中一个比较常用的就是getattr()用来调用一个类中的变量或者方法,相关联的hasattr()、getattr()、setattr()函数的使用也一并学习了一下。

正文:

1. hasattr(object, name)

判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法;有则返回True,没有则返回False;需要注意的是name参数是string类型,所以不管是要判断变量还是方法,其名称都以字符串形式传参;getattr和setattr也同样;

>>> 
>>> class A():
  name = 'python'
  def func(self):
    return 'A()类的方法func()'
>>> 
>>> hasattr(A, 'name')
True
>>> 
>>> hasattr(A, 'age')
False
>>> 
>>> hasattr(A, 'func')
True
>>>

2. getattr(object, name[, default])

获取object对象的属性的值,如果存在则返回属性值,如果不存在分为两种情况:

(1)没有default参数时,会直接报错;

(2)给定了default参数,若对象本身没有name属性,则会返回给定的default值;

如果给定的属性name是对象的方法,则返回的是函数对象,需要调用函数对象来获得函数的返回值;调用的话就是函数对象后面加括号,如func之于func();

另外还需要注意:

如果给定的方法func()是实例函数,则不能写getattr(A, 'func')(),因为fun()是实例函数的话,是不能用A类对象来调用的,应该写成getattr(A(), 'func')();

实例函数和类函数的区别:

实例函数定义时,直接def func(self):,这样定义的函数只能是将类实例化后,用类的实例化对象来调用;

而类函数定义时,需要用@classmethod来装饰,函数默认的参数一般是cls,类函数可以通过类对象来直接调用,而不需要对类进行实例化;

>>> 
>>> class A():
  name = 'python'
  def func(self):
    return 'Hello world'
>>> 
>>> getattr(A, 'name')
'python'
>>> 
>>> getattr(A, 'age')
# age变量不存在则报错
Traceback (most recent call last):
 File "<pyshell#464>", line 1, in <module>
  getattr(A, 'age')
AttributeError: class A has no attribute 'age'
>>> 
>>> getattr(A, 'age', 20)
>>> 
>>> getattr(A, 'func')
<unbound method A.func>
>>> 
>>> getattr(A, 'func')()

# func()函数不能被A类对象调用,所以报错, 需要用类的实例化对象来调用
Traceback (most recent call last):
 File "<pyshell#470>", line 1, in <module>
  getattr(A, 'func')()
TypeError: unbound method func() must be called with A instance as first argument (got nothing instead)
>>> 
>>> getattr(A(), 'func')()
'Hello world'
>>> 
>>> class A(object):
  

name = 'python'
  

@classmethod
  

def func(cls):
    


return 'the method of A object.'
>>> 
>>> getattr(A, 'func')()
'the method of A object.'
>>>

3. setattr(object, name, value)

给object对象的name属性赋值value,如果对象原本存在给定的属性name,则setattr会更改属性的值为给定的value;如果对象原本不存在属性name,setattr会在对象中创建属性,并赋值为给定的value;

>>> 
>>> class A():
  name = 'python'
  def func(self):
    return 'Hello world'
>>> 
>>> setattr(A, 'name', 'java')
>>> getattr(A, 'name')
'java'
>>> 
>>> setattr(A, 'age', 20)
>>> getattr(A, 'age')
>>>

一般先判断对象中是否存在某属性,如果存在则返回;如果不存在,则给对象增加属性并赋值:

>>> 
>>> class A():
  name = 'python'
  def func(self):
    return 'Hello world'
>>> 
>>> if hasattr(A, 'age'):
  print getattr(A, 'age')
else:
  setattr(A, 'age', 20)
>>> 
>>> getattr(A, 'age')
>>>

 感受一下:

python中hasattr()、getattr()、setattr()函数的使用

总结

以上所述是小编给大家介绍的python中hasattr()、getattr()、setattr()函数的使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
实例讲解Python设计模式编程之工厂方法模式的使用
Mar 02 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
使用Python创建简单的HTTP服务器的方法步骤
Apr 26 Python
python如何制作英文字典
Jun 25 Python
Pandas中DataFrame的分组/分割/合并的实现
Jul 16 Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 Python
python 实现手机自动拨打电话的方法(通话压力测试)
Aug 08 Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 Python
Python将列表中的元素转化为数字并排序的示例
Dec 25 Python
python标准库OS模块函数列表与实例全解
Mar 10 Python
django 模型中的计算字段实例
May 19 Python
关于的python五子棋的算法
May 02 Python
Python中IP地址处理IPy模块的方法
Aug 16 #Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 #Python
Pyinstaller 打包exe教程及问题解决
Aug 16 #Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 #Python
Python Web框架之Django框架文件上传功能详解
Aug 16 #Python
基于 Django 的手机管理系统实现过程详解
Aug 16 #Python
python创建与遍历List二维列表的方法
Aug 16 #Python
You might like
农民C键的运用技巧
2020/03/04 星际争霸
PHP常用代码大全(新手入门必备)
2010/06/29 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
jQuery select操作控制方法小结
2010/05/26 Javascript
基于jQuery架构javascript基础体系
2011/01/01 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
innerText 使用示例
2014/01/23 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
2019/05/30 NodeJs
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
ES6 十大特性简介
2020/12/09 Javascript
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
python实现计算倒数的方法
2015/07/11 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
Python 操作 MySQL数据库
2020/09/18 Python
Html5之title吸顶功能
2018/06/04 HTML / CSS
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
成教毕业生自我鉴定
2013/10/23 职场文书
酒店出纳岗位职责
2013/12/29 职场文书
采购部部长岗位职责
2014/02/06 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
Python 数据可视化之Bokeh详解
2021/11/02 Python
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js