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函数可变参数定义及其参数传递方式实例详解
May 25 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
深入理解python中的select模块
Apr 23 Python
Django如何实现内容缓存示例详解
Sep 24 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
Python 实现两个服务器之间文件的上传方法
Feb 13 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
Python简易计算器制作方法代码详解
Oct 31 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
使用keras和tensorflow保存为可部署的pb格式
May 25 Python
通过实例解析Python RPC实现原理及方法
Jul 07 Python
Python实现疫情地图可视化
Feb 05 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
基于mysql的论坛(3)
2006/10/09 PHP
php一些公用函数的集合
2008/03/27 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
Javascript常考语句107条收集
2010/03/09 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
分页栏的web标准实现
2011/11/01 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
浅谈Angular7 项目开发总结
2018/12/19 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
Python实现简单HTML表格解析的方法
2015/06/15 Python
快速入手Python字符编码
2016/08/03 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
python实现串口自动触发工作的示例
2019/07/02 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
物流创业计划书
2014/02/01 职场文书
舞蹈毕业生的自我评价
2014/03/05 职场文书
体育节口号
2014/06/19 职场文书
升学宴学生答谢词
2015/01/05 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
理解python中装饰器的作用
2021/07/21 Python
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python