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中for循环详解
Jan 17 Python
Python实现获取操作系统版本信息方法
Apr 08 Python
Python中List.count()方法的使用教程
May 20 Python
python清除指定目录内所有文件中script的方法
Jun 30 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
Python 加密的实例详解
Oct 09 Python
初探TensorFLow从文件读取图片的四种方式
Feb 06 Python
详解Python字典的操作
Mar 04 Python
python读取Kafka实例
Dec 23 Python
Python3实现建造者模式的示例代码
Jun 28 Python
Python函数调用追踪实现代码
Nov 27 Python
python中的sys模块和os模块
Mar 20 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
php二维码生成
2015/10/19 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
Python yield的用法实例分析
2020/03/06 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
利用 Canvas实现绘画一个未闭合的带进度条的圆环
2019/07/26 HTML / CSS
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
优秀团员个人事迹材料
2014/01/29 职场文书
学生党支部先进事迹
2014/02/04 职场文书
公司司机岗位职责
2014/02/07 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
工作收入住址证明
2014/10/28 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书