[ python ] hasattr()、getattr()、setattr() 三者关系及运用
hasattr(object, name)
判断一个对象(object)是否存在name属性或方法,返回boolean值,有name属性返回True, 否则返回False
In [1]: class Test(object):
...: name = 'hkey'
...: def hello(self):
...: print('hello', self.name)
...: In [2]: t = Test() In [3]: print(hasattr(t, 'name')) # 注意:属性'name'是需要引号引起来的
True In [4]: print(hasattr(t, 'hello')) # 方法也是类的属性
True
getattr(object, name[, default])
获取对象object的属性或方法(name), 如果存在打印出来,如果不存在,打印默认值,默认值可选,默认值不存在报错对象没有该属性;
In [1]: class Test(object):
...: name = 'hkey'
...: def hello(self):
...: print('hello ', self.name)
...: In [2]: t = Test() In [3]: print(getattr(t, 'name'))
hkey In [4]: print(getattr(t, 'hello'))
<bound method Test.hello of <__main__.Test object at 0x000001499524EE80>> In [5]: print(getattr(t, 'age'))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-5-bd4a642cfb8c> in <module>()
----> 1 print(getattr(t, 'age')) # 没有该属性或方法 AttributeError: 'Test' object has no attribute 'age' In [6]: print(getattr(t, 'age', 20)) # 设置默认值
20
setattr(object, name, values)
给对象的属性赋值,若属性不存在,先创建再赋值
# object不存在属性(age), 用 setattr 新增属性 'age'
In [1]: class Test(object):
...: name = 'hkey'
...: def hello(self):
...: print('hello ', self.name)
...: In [2]: t = Test() In [3]: print(hasattr(t, 'age'))
False In [4]: setattr(t, 'age', 20) In [5]: print(hasattr(t, 'age'))
True In [6]: print(getattr(t, 'age'))
20 # object 存在属性(name), 用 setattr 覆盖原属性值
In [1]: class Test(object):
...: name = 'hkey'
...: def hello(self):
...: print('hello ', self.name)
...: In [2]: t = Test() In [3]: print(hasattr(t, 'name')) # 使用 hasattr 检查object 是否存在'name'属性, True为存在
True In [4]: setattr(t, 'name', 'superman') # setattr 重新为'name'属性赋值为'superman' In [5]: print(getattr(t, 'name')) # 使用getattr 获取'name'属性的值
superman In [6]: print(t.name) # 直接调用实例't'的name属性
superman
从上面的实例发现,如果object已经存在属性,再次使用setattr为该属性赋值,该属性会发生变化,这里值得注意。
hasattr(), getattr(), setattr() 使用场景
* 作为反射对程序进行解耦操作 *
In [1]: class Test(object):
...: def __init__(self):
...: self.x = 1
...: self.y = 2
...:
...: def sum(self):
...: print(self.x + self.y)
...:
...: def sub(self):
...: print(self.x - self.y)
...: In [2]: t = Test() In [3]: while True:
...: cmd = input('-->').strip()
...: if hasattr(t, cmd): # 'hasattr' 判断 'cmd' 属性是否存在
...: func = getattr(t, cmd) # getattr 获取 'cmd' 属性的值
...: func() # 执行该属性
...: else:
...: setattr(t, cmd, t.sum) # 如果输入不存在的属性名, 使用 'setattr' 重新为 'cmd' 赋值为 't.sum'
...: func = getattr(t, cmd) # getattr 获取 'cmd' 属性的值
...: func() # 执行该属性
...: # 执行结果:
-->sum
3
-->sub
-1
-->dddddd
3
[ python ] hasattr()、getattr()、setattr() 三者关系及运用的更多相关文章
- Python hasattr,getattr,setattr,delattr
#!/usr/bin/env python # -*- coding:utf-8 -*- # 作者:Presley # 邮箱:1209989516@qq.com # 时间:2018-11-04 # 反 ...
- Python的getattr(),setattr(),delattr(),hasattr()及类内建__getattr__应用
@Python的getattr(),setattr(),delattr(),hasattr() 先转一篇博文,参考.最后再给出一个例子 getattr()函数是Python自省的核心函数,具体使用大体 ...
- 【转】Python的hasattr() getattr() setattr() 函数使用方法详解
Python的hasattr() getattr() setattr() 函数使用方法详解 hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值 ...
- python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类
isinstance 是 python中的内置函数 , isinstance()用来判断一个函数是不是一个类型 issubclass 是python 中的内置函数, 用来一个类A是不是另外一个 ...
- hasattr() & getattr() & setattr()
Python的hasattr() getattr() setattr() 函数使用方法详解 感谢作者 ---> 原文链接 hasattr(object, name) 判断一个对象里面是否有n ...
- 反射之hasattr() getattr() setattr() 函数
Python的hasattr() getattr() setattr() 函数使用方法详解 hasattr(object, name)判断object中有没有一个name字符串对应的方法或属性,返回B ...
- isinstance/type/issubclass的用法,反射(hasattr,getattr,setattr,delattr)
6.23 自我总结 面向对象的高阶 1.isinstance/type/issubclass 1.type 显示对象的类,但是不会显示他的父类 2.isinstance 会显示的对象的类,也会去找对象 ...
- [转]Python的getattr(),setattr(),delattr(),hasattr()
getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattrGetattr用于返回一个对象属性,或者方法 class A: def __init__(self): ...
- python eval() hasattr() getattr() setattr() 函数使用方法详解
eval() 函数 --- 将字符串str当成有效的表达式来求值并返回计算结果. 语法:eval(source[, globals[, locals]]) ---> value 参数: sour ...
随机推荐
- HDU3480:Division——题解
http://acm.hdu.edu.cn/showproblem.php?pid=3480 将一列数划分成几个集合,这些集合的并集为该数列,求每个数列的(最大值-最小值)^2的和的最小值. 简单的d ...
- BZOJ2823 [AHOI2012]信号塔 【最小圆覆盖】
题目链接 BZOJ2823 题解 最小圆覆盖模板 都懒得再写一次 #include<iostream> #include<cstdio> #include<cmath&g ...
- 洛谷 P3242 [HNOI2015]接水果 解题报告
P3242 [HNOI2015]接水果 题目描述 风见幽香非常喜欢玩一个叫做 \(osu!\) 的游戏,其中她最喜欢玩的模式就是接水果.由于她已经\(DT\) \(FC\) 了\(\tt{The\ b ...
- UVA.122 Trees on the level(二叉树 BFS)
UVA.122 Trees on the level(二叉树 BFS) 题意分析 给出节点的关系,按照层序遍历一次输出节点的值,若树不完整,则输出not complete 代码总览 #include ...
- javascript forEach无法break,使用every代替
every的入口参数是一个返回bool值的函数,在需要break的地方return false,其他均return true,即可达到和break相同的效果 function find(arr2, e ...
- MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序
MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3中比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...
- HDU1166:敌兵布阵(线段树模板)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- mybatis <where>、<set>、<trim>、<sql>、<foreach>标签的使用
转:http://www.cnblogs.com/lixiujie/p/5766669.html <resultMap>标签的使用:这个类似于hibernte用于映射我们创建的vo对象与数 ...
- SQLite 学习笔记
SQLite 学习笔记. 一.SQLite 安装 访问http://www.sqlite.org/download.html下载对应的文件. 1.在 Windows 上安装 SQLite. ...
- python socket和简单tcp通信实现
python 服务端和客户端的简单交互 TCP服务端: 1 创建套接字,绑定套接字到本地IP与端口 s = socket.socket(socket.AF_INET,socket.SOCK_STREA ...