场景:

python中__get__,__getattr__,__getattribute__的区别

__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的一个属性被调用)

class C(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)

return self

def foo(self, x):

print(x)

class C2(object):

d = C()

if __name__ == '__main__':

c = C()

c2 = C2()

print(c.a)

print(c.zzzzzzzz)

c2.d

print(c2.d.a)

输出结果是:

__getattribute__() is called

abc

__getattribute__() is called

__getattr__() is called

zzzzzzzz from getattr

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

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

__getattribute__() is called

abc

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

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

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

pythongetattribute_python getattribute相关推荐

  1. getparameter java_java中getAttribute与getParameter方法的区别

    知识点1:getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为object对象类型 例:re ...

  2. pageContext.findAttribute()与pageContext.getAttribute()的区别

    1.abstract Object findAttribute(String name) 依次在page,request,session(如果有效的话)和application Scope(范围)查找 ...

  3. getAttribute() 与 attr() 的区别

    https://blog.csdn.net/xiphap/article/details/79397060 一直以为 getAttribute() 和 attr() 都是获取元素属性的方法,只是一种是 ...

  4. echarts Cannot read property ‘getAttribute‘ of null 问题的解决方法

    echarts Cannot read property 'getAttribute' of null 问题的解决方法 参考文章: (1)echarts Cannot read property 'g ...

  5. getAttribute与getParameter区别

    当两个Web组件之间为转发关系时,转发源会将要共享 request范围内的数据先用setAttribute将数据放入到HttpServletRequest对象中,然后转发目标通过 getAttribu ...

  6. request.getParameter和request.getAttribute之间的区别

    HttpServletRequest类既有getAttribute()方法,也由getParameter()方法,这两个方法有以下区别: (1)HttpServletRequest类有setAttri ...

  7. jsp中setAttribute与getAttribute方法使用介绍

    jsp中setAttribute与getAttribute方法使用介绍,然后还可以用getAttribute方法来取出. setAttribute.jsp页面源码实例,设置保存当前的日期: <% ...

  8. JS getAttribute和setAttribute(取得和设置属性)的使用介绍

    getAttribute:取得属性: setAttribute:设置属性: 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 ...

  9. request.getAttribute()和 request.getParameter()有何区别?

    a.request.getParameter()获取的类型是String:request.getAttribute()获取的类型是Object. b.request.getPrameter()获取的是 ...

  10. php domdocument getattribute,PHP DOMElement getAttribute()用法及代码示例

    DOMElement::getAttribute()函数是PHP中的内置函数,用于获取带有当前节点名称的属性值. 用法: string DOMElement::getAttribute( string ...

最新文章

  1. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈
  2. CSS3文本居中显示、圆形圆角绘制、立体阴影效果设置实例演示
  3. java前补零工具类_java生成编码工具类,不足补0
  4. CCIE-LAB-第十二篇-EIGRP+EIGRP末节区域+leak map+分发列表
  5. charles 安装 ssl_最全面的解决Charles手机抓包的证书问题(步骤非常详细)
  6. java 串的顺序存储_算法入门之串的顺序存储表示
  7. 华为软件java笔试_华为软件笔试题4.10
  8. BZOJ5343 [Ctsc2018]混合果汁 【二分 + 主席树】
  9. mysql 数据类型 真假_【转】MySQL数据类型
  10. Google Chrome 最新市场份额
  11. 如法炮制的意思,成语如法炮制的炮什么意思?
  12. Linux——系统引导流程学习简单笔记
  13. 计算机2级怎么插u盘,台式电脑怎么插u盘
  14. FAT文件系统详解(一)
  15. scrapy 爬取腾讯招聘网
  16. 计算机组成原理-存储器的层次结构
  17. 以QRcode为例聊聊二维码的现状与未来(Java版本)
  18. 下载文件、根据链接生成二维码
  19. 卡塔尔世界杯有哪些高科技?-世界杯征文
  20. 写给女孩:二十岁之后的每一年都很重要

热门文章

  1. 大话IT职场之-办公室政治
  2. JavaScript判断真值和假值
  3. 听孔文达老师《IT职业规划经验谈》WEBCAST笔记
  4. 2.2 Java内存介绍-运行时数据区
  5. 浅析scipy.signal.find_peaks()
  6. 第三季-第26课-守护进程设计
  7. 第三季-第21课-多线程同步
  8. linux怎么实时查看目录下是否有文件生成
  9. Centos 6.4 /var/log/secure 日志不记录问题
  10. hdu4757(可持久化 Trie )