相信大家看到这个标题的时候也会立马在脑海里面过一遍,觉得大多数时候我们并不太需要关注getattribute和getattr的一些细节(至少我自己吧:)),

一般情况下消费我们自定义的类的时候,我们对类的结构都了解,不会刻意偏离,造成一些属性访问的错误。

不过作为一个有好奇心有追求有气质的python宝宝,怎么可能不稍稍研究一下呢。好吧,其实是在github上读到一个开源项目sinaweibopy的源码才看的,代码挺有意思,正好当作一个实用的例子,来看看如何自定义实现gettattr让代码更加的动态优雅:

# 例子在原来的基础上简化了一下,排除依赖和干扰,详细参见原项目

class UrlGenerator(object):

def __init__(self, root_url):

self.url = root_url

def __getattr__(self, item):

if item == 'get' or item == 'post':

print self.url

return UrlGenerator('{}/{}'.format(self.url, item))

url_gen = UrlGenerator('http://xxxx')

url_gen.users.show.get

>>> http://xxxx/users/show

充分利用getattr会在没有查找到相应实例属性时被调用的特点,方便的通过链式调用生成对应的url,源代码中在碰到http method的时候返回一个

可调用的对象更加的优雅,链式的操作不仅优雅而且还能很好的说明调用的接口的意义(restful的接口啦)。

既然能通过定制类的getattr自定义方法来实现一些优雅的功能,自然我们也要对它有一些了解,包括和它相似的自定义方法getattribute

1. 用作实例属性的获取和拦截

当访问某个实例属性时, getattribute会被无条件调用,如未实现自己的getattr方法,会抛出AttributeError提示找不到这个属性,如果自定义了自己getattr方法的话,方法会在这种找不到属性的情况下被调用,比如上面的例子中的情况。所以在找不到属性的情况下通过实现自定义的getattr方法来实现一些功能是一个不错的方式,因为它不会像getattribute方法每次都会调用可能会影响一些正常情况下的属性访问:

class Test(object):

def __init__(self, p):

self.p = p

def __getattr__(self, item):

return 'default'

t = Test('p1')

print t.p

print t.p2

>>> p1

>>> default

2. 自定义getattribute的时候防止无限递归

因为getattribute在访问属性的时候一直会被调用,自定义的getattribute方法里面同时需要返回相应的属性,通过self.__dict__取值会继续向下调用getattribute,造成循环调用:

class AboutAttr(object):

def __init__(self, name):

self.name = name

def __getattribute__(self, item):

try:

return super(AboutAttr, self).__getattribute__(item)

except KeyError:

return 'default'

这里通过调用绑定的super对象来获取队形的属性,对新式类来说其实和object.__getattribute__(self, item)一样的道理:

默认情况下自定义的类会从object继承getattribute方法,对于属性的查找是完全能用的

getattribute的实现感觉还是挺抽象化的,只需要绑定相应的实例对象和要查找的属性名称就行

3.同时覆盖掉getattribute和getattr的时候,在getattribute中需要模仿原本的行为抛出AttributeError或者手动调用getattr

class AboutAttr(object):

def __init__(self, name):

self.name = name

def __getattribute__(self, item):

try:

return super(AboutAttr, self).__getattribute__(item)

except KeyError:

return 'default'

except AttributeError as ex:

print ex

def __getattr__(self, item):

return 'default'

at = AboutAttr('test')

print at.name

print at.not_exised

>>>test

>>>'AboutAttr' object has no attribute 'not_exised'

>>>None

上面例子里面的getattr方法根本不会被调用,因为原本的AttributeError被我们自行处理并未抛出,也没有手动调用getattr,所以访问not_existed的结果是None而不是default.

关于getattribute和getattr的特性与区别就扯到这,要更深入的了解可以自行google,编写高质量代码:改善Python程序的91个建议这本书里面也有一些详细的介绍。

参考资料:

pythongetattribute_Python __getattribute__ vs __getattr__ 浅谈相关推荐

  1. 浅谈__getattribute__与__getattr__

    参加校招的时候被面试官问到了,没能答上,主要是混淆了__getattribute__和__getattr__两个魔法方法.因此这里笔记一下. 首先我们看看如何访问一个对象的属性: class A(ob ...

  2. python类中方法的执行顺序-浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  3. python方法解析顺序_浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  4. 浅谈python 里面的单下划线与双下划线的区别

    更新时间:2017年12月01日 10:30:13   作者:空气中的臭氧 这篇文章主要介绍了浅谈python 里面的单下划线与双下划线的区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起 ...

  5. 浅谈MySQL存储引擎-InnoDBMyISAM

    浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...

  6. 【大话设计模式】——浅谈设计模式基础

    初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...

  7. 学校计算机机房好处,浅谈学校计算机机房维护

    浅谈学校计算机机房维护    现在的学校机房都配置了数量较多的计算机,而且机房的使用非常频繁.对于怎样维护好计算机,特别是计算机软件系统,对广大计算机教师来说是一个很重要且非常现实的问题.下面就本人在 ...

  8. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  9. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

最新文章

  1. oracle取得表中总记录数最快的方法
  2. Python3 requests post 中文乱码 UnicodeEncodeError: ‘latin-1‘ codec can`t encode characters in ……
  3. 转:多线程环境下调用 HttpWebRequest 并发连接限制
  4. servlet请求和响应的过程
  5. SpringMVC 文件上传
  6. Python3实现Win10桌面背景自动切换
  7. 计算机专业实习实训内容和要求,大学生计算机实习目的和要求.doc
  8. linux下ssh下载命令,SSH 登录工具常用命令
  9. 云计算的工作原理是什么?
  10. 紫猫插件-网络共享数据(1-6)
  11. 单片机课程设计题目及要求——电风扇模拟控制系统(仿真图加代码加原理图都有)
  12. 延庆区计算机学校,【基层链接】发展中的校园欢迎你——延庆五中现代化的教学专室与设备系列...
  13. 快门速度,光圈,感光度
  14. HTML打造动漫人物,19个搭配很酷的卡通人物网站设计欣赏
  15. 多模态语义检索 | 基于 MetaSpore 快速部署 HuggingFace 预训练模型
  16. 系统学习SSH(一)--SSH
  17. kali --之 Maltego ce 的使用教程
  18. 美国NIST公布首批后量子密码标准算法
  19. 关闭Eslint中的规则 no-unused-vars
  20. 数据载入、存储及文件格式——《利用python数据分析》第六章学习

热门文章

  1. 2015.7.9(1000股涨停,未按分段交易中国重工、中国软件减仓失误!补做大智慧、中色股份追高,而后控制仓位预防高开跳水——重新整理分段交易原则)发现中软吸筹率极高...
  2. Adaptive Placeholder – 自适应的占位符效果
  3. Javascript面向对象全面剖析 —创建对象
  4. VS2013打包生成安装文件setup.exe(详细图解)
  5. python 求点到线段距离
  6. 夜晚较为活跃之物种对照图
  7. No SOURCES given to target: mpeg
  8. Common Lisp环境篇(slime+sbcl)(零)
  9. Android解压/重新打包system.img
  10. VALSE学习(七):跨媒体分析-Cross-Media Analysis and Intelligence