__get__,__getattr__和__getattribute都是访问属性的方法,但不太相同。

object.__getattr__(self, name)

当一般位置找不到attribute的时候,会调用getattr,返回一个值或AttributeError异常。

object.__getattribute__(self, name)

无条件被调用,通过实例访问属性。如果class中定义了__getattr__(),则__getattr__()不会被调用(除非显示调用或引发AttributeError异常)

object.__get__(self, instance, owner)

如果class定义了它,则这个class就可以称为descriptor。owner是所有者的类,instance是访问descriptor的实例,如果不是通过实例访问,而是通过类访问的话,instance则为None。(descriptor的实例自己访问自己是不会触发__get__,而会触发__call__,只有descriptor作为其它类的属性才有意义。)(所以下文的d是作为C2的一个属性被调用)

classC(object):

a= 'abc'

def __getattribute__(self, *args, **kwargs):print("__getattribute__() is called")return object.__getattribute__(self, *args, **kwargs)#return "haha"

def __getattr__(self, name):print("__getattr__() is called")return name + "from getattr"

def __get__(self, instance, owner):print("__get__() is called", instance, owner)returnselfdeffoo(self, x):print(x)classC2(object):

d=C()if __name__ == '__main__':

c=C()

c2=C2()print(c.a)print(c.zzzzzzzz)

c2.dprint(c2.d.a)

输出结果是:

__getattribute__() iscalled

abc__getattribute__() iscalled__getattr__() iscalled

zzzzzzzzfromgetattr__get__() is called <__main__.c2 object at>

__get__() is called <__main__.c2 object at>

__getattribute__() iscalled

abc

小结:可以看出,每次通过实例访问属性,都会经过__getattribute__函数。而当属性不存在时,仍然需要访问__getattribute__,不过接着要访问__getattr__。这就好像是一个异常处理函数。

每次访问descriptor(即实现了__get__的类),都会先经过__get__函数。

需要注意的是,当使用类访问不存在的变量是,不会经过__getattr__函数。而descriptor不存在此问题,只是把instance标识为none而已。

from : http://luozhaoyu.iteye.com/blog/1506426

python中get属性_python3中__get__,__getattr__,__getattribute__的区别相关推荐

  1. php中border属性,css中display属性和border属性常遇问题讲解

    本篇文章给大家带来的内容是关于css中display属性和border属性常遇问题讲解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.因为HTML很少有太复杂的问题,所以直接写一篇关于 ...

  2. CSS中position属性(abusolute | relative | static | fixed)区别

    关于css3中position属性的定义: 转载于:https://www.cnblogs.com/tangjiao/p/9025934.html

  3. css中white-space 属性:“pre”, “pre-line”, “pre-wrap” “nowrap”的区别

    在css中white-space属性用来控制容器的文本中带有空白符.制表符.换行符等的显示,取值有: normal:默认,忽略文本中所有的空白.换行符:只有文本存在 <br> 或文本达到框 ...

  4. python 类中定义列表_Python3中的自定义列表类,具有

    我想用python3编写一个自定义列表类,就像在这个问题How would I create a custom list class in python?中一样,但与该问题不同,我想实现__get__ ...

  5. python中search用法_Python3中正则模块re.compile、re.match及re.search函数用法详解

    本文实例讲述了Python3中正则模块re.compile.re.match及re.search函数用法.分享给大家供大家参考,具体如下: re模块 re.compile.re.match. re.s ...

  6. python的name属性_Python中__name__属性的妙用

    在Python中,每一个module文件都有一个built-in属性:__name__,这个__name__有如下特点: 1 如果这个module文件是被别的文件导入的,那么,该__name__属性的 ...

  7. python str byte编码_Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题...

    Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str ...

  8. pass在python中啥意思_python3中的pass是什么意思

    python中的pass语句通常是起到占位符的作用,保持格式完整. 以if语句为例,在c或c++/java中:if(true) ; //do nothing else { //do something ...

  9. python中encode用法_python3中encode和decode的一些基本用法

    python3中encode和decode跟python2还是有一定的区别的,在python3中: encode(编码):按照某种规则将"文本"转换为"字节流" ...

最新文章

  1. 树的基本操作的非递归实现
  2. 《libGDX移动游戏开发从入门到精通》一第2章 libGDX的架构分析
  3. Zeal编程查询,离线文档浏览器
  4. 删除目录下的特定命名的图片,获取特定名称图片的路径
  5. Netty详解(三):Netty 入门应用
  6. 理解UIView的绘制
  7. [BUUCTF-pwn]——pwn2_sctf_2016
  8. 常用的正则表达式---学习笔记(一)
  9. VS2013 使用QCustomPlot等三方库如何配置
  10. html鼠标离开点击停留,Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)...
  11. locustfile中的User类和HttpUser类
  12. Spark教程——(2)编写spark-submit测试Demo
  13. 快速无需脚本直接用迅雷下载页面全部链接
  14. JavaWeb学习DAY2—Java web的创建
  15. GB2312、BIG5、GBK、GB18030简介
  16. 用AI如何预测《权力的游戏》死亡名单?真是神了!
  17. java win7 管理员权限_Win7系统如何一键取得管理员权限
  18. 字体设计编辑软件Glyphs 2 for mac中文版v2.6.6(1350)
  19. 三、Oracle/支付宝/旺旺
  20. choco设置后续软件默认安装路径

热门文章

  1. Openstack Object Store(Swift)设置公有存储的方法
  2. zabbix-自定义监控项
  3. python处理txt文件的一种情况
  4. SSM框架使用遇到的问题
  5. 移动站适配rel=alternate PC页和H5页适配标注
  6. 即使是菜鸟,也能配置出一个网站
  7. openwrt 设置samba服务器与pc共享文件
  8. 输入输出挂,手动扩栈。
  9. Ubuntu12.04 配置JDK7
  10. 其他——[转]从实现iPhone的OAuth封装看国内互联网和开放平台