这里的属性即包括属性变量,也包括属性方法。即类的变量和方法。

当访问某个实例属性时, getattribute会被无条件调用,如未实现自己的getattr方法,会抛出AttributeError提示找不到这个属性,如果自定义了自己getattr方法的话,方法会在这种找不到属性的情况下被调用,比如上面的例子中的情况。

所以在找不到属性的情况下通过实现自定义的getattr方法来实现一些功能是一个不错的方式,因为它不会像getattribute方法每次都会调用可能会影响一些正常情况下的属性访问

使用这几个方法可以实现拦截器啥、动态代理、统一log等功能。

举例:

1、使用__getattribute__实现统一的打印日志功能。使用__getattribute__方法拦截了属性和方法的访问。__getattribute__只有在新式类中才能使用。

# -*- coding: utf-8 -*-
class Fjs(object):def __init__(self, name):self.name = namedef hello(self):print "said by : ", self.namedef __getattribute__(self, item):print "访问了特性:" + itemreturn object.__getattribute__(self, item)fjs = Fjs("fjs")
print fjs.name
fjs.hello()

输出:

访问了特性:name
fjs
访问了特性:hello
said by :  访问了特性:name
fjs

2、这里通过__getattr__方法,将所有的特性的访问都路由给了内部的fjs对象

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# -*- coding: utf-8 -*-
class Fjs(object):def __init__(self, name):self.name = namedef hello(self):print "said by : ", self.namedef fjs(self, name):if name == self.name:print "yes"else:print "no"class Wrap_Fjs(object):def __init__(self, fjs):self._fjs = fjsdef __getattr__(self, item):if item == "hello":print "调用hello方法了"elif item == "fjs":print "调用fjs方法了"return getattr(self._fjs, item)fjs = Wrap_Fjs(Fjs("fjs"))
fjs.hello()
fjs.fjs("fjs")

输出:

调用hello方法了
said by :  fjs
调用fjs方法了
yes

3、使用类的继承实现。则不会路由,子类直接继承了父类的属性和方法

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# -*- coding: utf-8 -*-
class Fjs(object):def __init__(self, name):self.name = namedef hello(self):print "said by : ", self.namedef fjs(self, name):if name == self.name:print "yes"else:print "no"class Wrap_Fjs(Fjs):def __init__(self, fjs):self._fjs = fjsdef __getattr__(self, item):if item == "hello":print "调用hello方法了"elif item == "fjs":print "调用fjs方法了"return getattr(self._fjs, item)fjs = Wrap_Fjs(Fjs("fjs"))
fjs.hello()
fjs.fjs("fjs")

输出:

said by :  fjs
yes

4、猜一下结果,理解其妙用

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 例子在原来的基础上简化了一下,排除依赖和干扰,详细参见原项目
class UrlGenerator(object):def __init__(self, root_url):self.url = root_urldef __getattr__(self, item):if item == 'get' or item == 'post':print self.urlreturn UrlGenerator('{}/{}'.format(self.url, item))url_gen = UrlGenerator('http://xxxx')
url_gen.users.show.get

5、通过转换,可以像访问属性一样访问dict中的键值对

class ObjectDict(dict):def __init__(self, *args, **kwargs):super(ObjectDict, self).__init__(*args, **kwargs)def __getattr__(self, name):value =  self[name]if isinstance(value, dict):value = ObjectDict(value)return valueif __name__ == '__main__':od = ObjectDict(asf={'a': 1}, d=True)print od.asf, od.asf.a     # {'a': 1} 1print od.d                 # True

Python的__getattribute__ vs __getattr__的妙用相关推荐

  1. python 的魔方方法__getattribute__ 和__getattr__方法介绍

    python 中有2个获取对象属性的方法__getattribute__ 和__getattr__方法比较容易混淆, 接下来说明下这2个魔方方法的区别及用法: __getattr__方法 class ...

  2. Python属性拦截器之__getattribute__与__getattr__

    在Python中自定义了很多内建属性,如__getattribute__(),即属性访问拦截器,它的作用是当我们访问实例对象的属性时,并不会立即返回属性的值,而是自动调用__getattribute_ ...

  3. 浅谈__getattribute__与__getattr__

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

  4. python getattr和getattribute_详解Python中 __get__和__getattr__和__getattribute__的区别

    引子 假设我们有个类A,其中a是A的实例 a.x时发生了什么?属性的lookup顺序如下: 如果重载了__getattribute__,则调用. a.__dict__, 实例中是不允许有descrip ...

  5. pythongetattribute_Python __getattribute__ vs __getattr__ 浅谈

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

  6. Python 属性__getattribute__

    首先理解__getattribute__的用法,先看代码: class Tree(object):def __init__(self,name):self.name = nameself.cate = ...

  7. __getattribute__()、__getattr__()、__setattr__()、__delattr__()

    访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...

  8. python中的__dict__,__getattr__,__setattr__

    python class 通过内置成员__dict__ 存储成员信息(字典) 首先用一个简单的例子看一下__dict__ 的用法 class A():def __init__(self,ax,bx): ...

  9. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

最新文章

  1. “未卜先知”、“自学成才”:GANs奇思妙想TOP10
  2. 得到文件的服务器路径,如何获取服务器上的路径?
  3. java 抽象类,接口,object类详解
  4. python多线程为啥是假的?(GIL 全局解释器锁)(python多线程不适合并行化的计算密集型代码)
  5. Scala模拟Spark分布式计算流程示例代码
  6. matlab计算斜方差_Matlab求方差,均值,均方差,协方差的函数
  7. 地方微信群分享小程序源码,自带流量主独立版
  8. mysql统计今天发布了多少条_Mysql统计总结 - 最近30天,昨天的数据统计
  9. 火车站售票系统_好消息!海门火车站自助售取票机增加自助退票功能
  10. 阿里重磅开源中后台UI解决方案Fusion
  11. 知识蒸馏 | 综述:蒸馏机制
  12. 抽象实现接口,default修饰接口方法
  13. Java实现校园论坛系统
  14. 数据结构面试经典问题汇总
  15. 施耐德 m340 编程手册_施耐德推出开放自动化平台,开启“软件驱动自动化”时代...
  16. 论文阅读:LinkNet: Exploiting Encoder Representations forEfficient Semantic Segmentation
  17. 概率论_证明_切比雪夫大数定律
  18. 一年365天每天进步 1‰和每天退步 1‰最后的结果分别是多少
  19. cad引出线段lisp_lisp将多条线条合并成一条多段线
  20. CISCO交换机3850升级

热门文章

  1. 数据库连接池之_DButils
  2. hdu 1556 Color the ball
  3. Python探索记(01)——HelloWorld及Python的注释
  4. MyBatis学习总结(七)——Mybatis缓存
  5. Xfire方式开发和解析webservice
  6. [转载] 羽毛球——学打羽毛球 09 步法的基本概念
  7. linux编程之pthread_create函数
  8. Active Directory的复制拓扑,Active Directory系列之八
  9. 发现一个问题,可能是Sql Express 2005的Bug
  10. java nfa dfa_DFA与NFA