Python的attr三兄弟(getattr、hasattr、setatter)
阅读源码的时候,经常看见hasattr
、getattr
、setattr
,感觉很酷炫的同时,也是不解其义,特此来说说道说道这三兄弟
getattr已经介绍过了,主要说说setattr和hasattr
hasattr(对象,属性名)![](https://upload-images.jianshu.io/upload_images/14229282-f7a6ea00601011d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
I、基本操作
- 1、查看对是不是该属性,返回值为boolean类型
- 2、 一个危险的Python函数,不推荐使用这篇文章说道hasattr会把@property装饰的方法隐藏掉,以至于使用第三方库的时候,不知道对方是否使用了这个装饰器,而造成错误。
- 3、但是这篇文章是三年前写的,这个问题已经被修复了。可以愉快的使用了,但是如果使用Python2x或者需要编写适配Python全系列的话,还是不要用太多
class Test:@propertydef name(self):return "Despair"@propertydef age(self):return 11T = Test()
print(hasattr(T, 'name'))
print(getattr(T, 'name', None))
print(hasattr(T, 'age'))
print(getattr(T, 'age', None))
-----
True
Despair
True
11
II、速度效益
- 1、上面那篇文章说,hasattr内部实现是调用getattr,经过试验,这个也被改过了,hasattr的速度并不比getattr慢
from timeit import timeitdescription = '''\
class Test:@propertydef name(self):return 'Donald'
a = Test()
'''stm = '''\
hasattr(a,'name')
'''
print(f'hasattr 执行10000次所需时间:{timeit(stmt=stm, setup=description, number=10000)}')stm = '''\
getattr(a, 'name', None)
'''
print(f'getattr 执行10000次所需时间:{timeit(stmt=stm, setup=description, number=10000)}')-----
hasattr 执行10000次所需时间:0.0015951709999999994
getattr 执行10000次所需时间:0.0016753230000000029
- 2、 可以看出来,运行时间hasattr还是略胜一筹,在Python3x中,hasattr还是可以愉快的玩耍的
setattr(对象,key, value)
I、基础操作
- 1、给对象添加一个属性,相当于在对象的__dict__中再添加一组键值对
- 2、如果是自己写的对象或者第三方的对象,是只可以直接使用
对象.__setattr__(key,value)
等效于setattr()。但是对自带的几种基本数据类型不起作用···具体原因,我目前不清楚
class Test:def __init__(self):self.name = "Donald"def name(self):return self.name a = Test()
print(a.__dict__)
setattr(a, 'a', 'hello') # setattr()
print(a.__dict__)
a.__setattr__('b', 'world') #__setattr__()
print(a.__dict__)*****
# 第三方模块
import requests
b = requests.session() # request的一个方法
print(b.__dict__)
b.__setattr__('a', 'hello')
print(b.__dict__)
------
# 新加的在最后面
{'headers': {'User-Agent': 'python-requests/2.19.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}, 'auth': None, 'proxies': {}, 'hooks': {'response': []}, 'params': {}, 'stream': False, 'verify': True, 'cert': None, 'max_redirects': 30, 'trust_env': True, 'cookies': <RequestsCookieJar[]>, 'adapters': OrderedDict([('https://', <requests.adapters.HTTPAdapter object at 0x120b6f0b8>), ('http://', <requests.adapters.HTTPAdapter object at 0x1212b3ef0>)])}
{'headers': {'User-Agent': 'python-requests/2.19.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}, 'auth': None, 'proxies': {}, 'hooks': {'response': []}, 'params': {}, 'stream': False, 'verify': True, 'cert': None, 'max_redirects': 30, 'trust_env': True, 'cookies': <RequestsCookieJar[]>, 'adapters': OrderedDict([('https://', <requests.adapters.HTTPAdapter object at 0x120b6f0b8>), ('http://', <requests.adapters.HTTPAdapter object at 0x1212b3ef0>)]), 'a': 'hello'}*****
# 数据类型
a = set()
print(a.__dict__)
------
AttributeError: 'set' object has no attribute '__dict__'
II、魔法方法
- 1、既然都有__setattr__这个用法了,在定义类的时候,肯定也是可以制定的
- 2、重写了
__setattr__
方法之后,添加一个新的属性的时候,会调用这个方法 - 3、定制
__setattr__
方法的时候,他传入的值不能直接使用,否则会陷入无限递归中
class Test:"""测试类"""@staticmethoddef name():return "Donald"def __setattr__(self, key, value):print(f'key->{key}')self.key = valuea = Test()
a.age = 10
-------------
key->key· # 很多个·
key->key
RecursionError: maximum recursion depth exceeded while calling a Python object
- 4、正确的写法是在实例属性的列表中植入,如:
self.__dict__[key] = value
class Test:"""测试类"""@staticmethoddef name():return "Donald"def __setattr__(self, key, value):print(f'key->{key}')self.__dict__[key] = valuea = Test()
a.age = 10
print(a.__dir__())
-----
key->age
['age', '__module__', '__doc__', 'name', '__setattr__', '__dict__', '__weakref__', '__repr__', '__hash__', '__str__', '__getattribute__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']
- 5、但是感觉这个魔法方的用武之地少的可怜,基本上都不会重写这个魔法方法
综上所所述:getattr在日常开发中用到的最多,当属老大,hasattr紧随其后,setattr的地位感觉会被property冲击
Python的attr三兄弟(getattr、hasattr、setatter)相关推荐
- python Excel数据处理三兄弟:xlrd/xlwt/xlutils!
常规的Excel数据处理中,就是对Excel数据文件的读/写/文件对象操作. 通过对应的python非标准库xlrd/xlwt/xlutils,来实现具体的数据处理业务逻辑. 在复杂的Excel业务数 ...
- Python面试题(三)
python面试题三 Python中类方法.类实例方法.静态方法有何区别 动态获取和设置对象的属性 Python的内存管理机制及调优手段 内存泄露是什么?如何避免 map函数和reduce函数 pri ...
- 1 自动化开源运维平台选择和功能思考 2 运维价值思考- 扁鹊三兄弟-昨天今天明天-个人家庭组织所有管理通用
运维价值 菜鸟与大神的区别 | 名称| 描述 | |-菜鸟-|- 遇到问题就犯愁(缺乏百度能力)学习力(对新技术没兴趣 不会自觉学习) 不相信BUG(奇迹)墨守成规| | 大神 | 见过很多问题(百度 ...
- Python机器学习(三)--决策树算法
Python机器学习(三)--决策树算法 原创 2014年07月14日 13:57:55
- python爬虫正则表达式实例-python爬虫学习三:python正则表达式
python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...
- 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript
设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...
- [转载]Python爬虫入门三之Urllib库的基本使用
python爬虫系列教程http://cuiqingcai.com/1052.html 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优 ...
- 第一章 TensorFlow基础——python语法(三)
简明Python基础(三) 此为jupyter notebook导出文档,如果习惯jupyter界面可以下载文件 链接:https://pan.xunlei.com/s/VMn5shjbvhvIPMq ...
- 【拔刀吧少年】之循环三兄弟for while until
循环三兄弟 一.echo命令 – 输出字符串或提取Shell变量的值 1.格式 2.常用参数 3.常用的转义字符 二.循环语句 1.for循环结构 2.while循环语句结构(迭代) 3.until ...
最新文章
- 马虎的算式 - 蓝桥杯
- python类加载机制_PHP面向对象自动加载机制原理与用法分析
- sas university edition在ubuntu中的使用
- Java的finally理解
- (20)HTML5 <summary>标签
- 【算法】剑指 Offer 46. 把数字翻译成字符串
- linux link path walk,python之os.walk()与os.path.walk()
- 【JAVA程序设计】从HelloWorld开始
- Codeforces Round #296 (Div. 1) E. Triangles 3000
- Androidの矢量图形之VectorDrawable研究
- matlab如何动态输出很长的图片,Qt实现长图片的放大缩小以及动态显示
- OpenWrt 把SD卡挂载到 /overlay
- 什么是生物质发电?生物质发电有哪些方法?
- php(wap)获取手机号码,WAP获取访客手机号码
- 面试题:你的缺点是什么?(为难我?怎么可能)
- 二叉树(Binary Trees)
- requireJS define require
- linux下实现dlna识别当前音频格式,通过 PulseAudio 实现局域网音乐播放
- 推荐系统快速开发--豆瓣电影推荐系统的快速实战开发(一)
- 关于分布式存储,这是你应该知道的(图文详解)
热门文章
- ObjectARX_面域
- 智能红外遥控器(八):小度音箱读取温湿度
- Linux 下查看文件系统类型
- 微信定位the permission value is offline verifying
- ArrayList排序
- 计算机开题报告指导教师意见,开题报告指导教师意见怎么写
- 2021αi优质职场卓越典范企业榜单公布,13家企业入选
- 是淳朴善良的大道人依靠独特的地理优势发展自己真实总结
- 【新学期】双非本科大三学长经验分享
- 微信支付 postman_微信版花呗“分付”开通入口在哪?2020年微信分付开通最全攻略!...