阅读源码的时候,经常看见hasattrgetattrsetattr,感觉很酷炫的同时,也是不解其义,特此来说说道说道这三兄弟

getattr已经介绍过了,主要说说setattr和hasattr

hasattr(对象,属性名)

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)相关推荐

  1. python Excel数据处理三兄弟:xlrd/xlwt/xlutils!

    常规的Excel数据处理中,就是对Excel数据文件的读/写/文件对象操作. 通过对应的python非标准库xlrd/xlwt/xlutils,来实现具体的数据处理业务逻辑. 在复杂的Excel业务数 ...

  2. Python面试题(三)

    python面试题三 Python中类方法.类实例方法.静态方法有何区别 动态获取和设置对象的属性 Python的内存管理机制及调优手段 内存泄露是什么?如何避免 map函数和reduce函数 pri ...

  3. 1 自动化开源运维平台选择和功能思考 2 运维价值思考- 扁鹊三兄弟-昨天今天明天-个人家庭组织所有管理通用

    运维价值 菜鸟与大神的区别 | 名称| 描述 | |-菜鸟-|- 遇到问题就犯愁(缺乏百度能力)学习力(对新技术没兴趣 不会自觉学习) 不相信BUG(奇迹)墨守成规| | 大神 | 见过很多问题(百度 ...

  4. Python机器学习(三)--决策树算法

    Python机器学习(三)--决策树算法 原创  2014年07月14日 13:57:55

  5. python爬虫正则表达式实例-python爬虫学习三:python正则表达式

    python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...

  6. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript

    设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...

  7. [转载]Python爬虫入门三之Urllib库的基本使用

    python爬虫系列教程http://cuiqingcai.com/1052.html 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优 ...

  8. 第一章 TensorFlow基础——python语法(三)

    简明Python基础(三) 此为jupyter notebook导出文档,如果习惯jupyter界面可以下载文件 链接:https://pan.xunlei.com/s/VMn5shjbvhvIPMq ...

  9. 【拔刀吧少年】之循环三兄弟for while until

    循环三兄弟 一.echo命令 – 输出字符串或提取Shell变量的值 1.格式 2.常用参数 3.常用的转义字符 二.循环语句 1.for循环结构 2.while循环语句结构(迭代) 3.until ...

最新文章

  1. 马虎的算式 - 蓝桥杯
  2. python类加载机制_PHP面向对象自动加载机制原理与用法分析
  3. sas university edition在ubuntu中的使用
  4. Java的finally理解
  5. (20)HTML5 <summary>标签
  6. 【算法】剑指 Offer 46. 把数字翻译成字符串
  7. linux link path walk,python之os.walk()与os.path.walk()
  8. 【JAVA程序设计】从HelloWorld开始
  9. Codeforces Round #296 (Div. 1) E. Triangles 3000
  10. Androidの矢量图形之VectorDrawable研究
  11. matlab如何动态输出很长的图片,Qt实现长图片的放大缩小以及动态显示
  12. OpenWrt 把SD卡挂载到 /overlay
  13. 什么是生物质发电?生物质发电有哪些方法?
  14. php(wap)获取手机号码,WAP获取访客手机号码
  15. 面试题:你的缺点是什么?(为难我?怎么可能)
  16. 二叉树(Binary Trees)
  17. requireJS define require
  18. linux下实现dlna识别当前音频格式,通过 PulseAudio 实现局域网音乐播放
  19. 推荐系统快速开发--豆瓣电影推荐系统的快速实战开发(一)
  20. 关于分布式存储,这是你应该知道的(图文详解)

热门文章

  1. ObjectARX_面域
  2. 智能红外遥控器(八):小度音箱读取温湿度
  3. Linux 下查看文件系统类型
  4. 微信定位the permission value is offline verifying
  5. ArrayList排序
  6. 计算机开题报告指导教师意见,开题报告指导教师意见怎么写
  7. 2021αi优质职场卓越典范企业榜单公布,13家企业入选
  8. 是淳朴善良的大道人依靠独特的地理优势发展自己真实总结
  9. 【新学期】双非本科大三学长经验分享
  10. 微信支付 postman_微信版花呗“分付”开通入口在哪?2020年微信分付开通最全攻略!...