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中装饰器的一个妙用
Feb 08 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
Python闭包思想与用法浅析
Dec 27 Python
python 将对象设置为可迭代的两种实现方法
Jan 21 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
简单了解Python读取大文件代码实例
Dec 18 Python
详解python UDP 编程
Aug 24 Python
Scrapy中如何向Spider传入参数的方法实现
Sep 28 Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 Python
python里反向传播算法详解
Nov 22 Python
python基础学习之递归函数知识总结
May 26 Python
浅谈Python协程asyncio
Jun 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+DBM的同学录程序(4)
2006/10/09 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
JS实现div模块的截图并下载功能
2017/10/17 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
Python之PyUnit单元测试实例
2014/10/11 Python
Python转换HTML到Text纯文本的方法
2015/01/15 Python
Python线程中对join方法的运用的教程
2015/04/09 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python实现XML文件解析的示例代码
2018/02/05 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
2020/02/29 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
Ruby如何定义一个类
2012/10/08 面试题
文秘专业大学生求职信
2013/11/10 职场文书
政治表现评语
2014/05/04 职场文书
大学生毕业评语
2014/12/31 职场文书