`
djangofan
  • 浏览: 35718 次
社区版块
存档分类
最新评论

python __getattribute__ 的优先级问题

 
阅读更多

The way __getattribute__() works needs to be covered, as it was implemented to behave in a very specific way. Thus it is very important to recognize this ordering:

  • Class attributes

  • Data descriptors

  • Instance attributes

  • Non-data descriptors

  • Defaulting to __getattr__()

A descriptor is a class attribute, so all class attributes have the highest priority.……这个是在core python programming 13.16节摘录下来的,这个是让我很困惑的地方;原因在于Class attributes 与Instance attributes的优先级问题;看下面的例子:



针对没有描述符的情况下,这个查找顺序应该是先查找的t.__dict__,然后才查找的Test.__dict__,总结起来就是先在obj.__dict__中查找,然后再查找obj.__class__.__dict__;

 

 

有数据描述符的情况下:

结果一幕了然,由于a是一个类属性,同时是一个数据描述符,__getattribute__在查找时应该是先访问了Test1.__dict__,如果存在且是数据描述符,则调用描述符的__get__or__set__,翻译起来就是:先查找type(obj).__dict__,如果属性存在并且是数据描述符,则执行data descriptor的__get__or__set__;

结论:属性/方法查找顺序

 

1.如果attr是一个Python自动产生的属性,找到!(优先级非常高!)

2.查找obj.__class__.__dict__,如果attr存在并且是data descriptor,返回data descriptor的__get__方法的结果,如果没有继续在obj.__class__的父类以及祖先类中寻找data descriptor

3.在obj.__dict__中查找,这一步分两种情况,第一种情况是obj是一个普通实例,找到就直接返回,找不到进行下一步。第二种情况是obj是一个类,依次在obj和它的父类、祖先类的__dict__中查找,如果找到一个descriptor就返回descriptor的__get__方法的结果,否则直接返回attr。如果没有找到,进行下一步。

4.在obj.__class__.__dict__中查找,如果找到了一个descriptor(插一句:这里的descriptor一定是non-data descriptor,如果它是data descriptor,第二步就找到它了)descriptor的__get__方法的结果。如果找到一个普通属性,直接返回属性值。如果没找到,进行下一步。

5.Defaulting to __getattr__()

6.raise AttributeError

 

 

引用:

http://onlypython.group.iteye.com/group/wiki/1362-python-39-s-descriptor

分享到:
评论

相关推荐

    详解Python中 __get__和__getattr__和__getattribute__的区别

    __get__、__getattr__、__getattribute都是访问属性的方法,但作用不太相同,这里我们就来详解Python中 __get__和__getattr__和__getattribute__的区别:

    对比Python中__getattr__和 __getattribute__获取属性的用法

    主要介绍了对比Python中__getattr__和 __getattribute__获取属性的用法,注意二者间的区别,__getattr__只作用于不存在的属性,需要的朋友可以参考下

    浅谈 Python 魔法函数 __getattr__ 与 __getattribute__

    目录魔法函数 __getattr__ 与 __getattribute____getattr__魔法函数作用__getattribute__魔法函数总结 书上说,天下没有不散的宴席,不要怕,书上还说了,人生何处不相逢。 ——《雪中悍刀行》 __getattr__魔法函数...

    Python __getattr__与__setattr__使用方法

    比如下面的例子: class Book(object): def __setattr__(self, name, value): if name == ‘value’: object.__setattr__(self, name, value – 100) else: object._... try: return object.__getattribute__(na

    Python中几种属性访问的区别与用法详解

    python的提供一系列和属性访问有关的特殊方法: __get__ , __getattr__ , __getattribute__ , __getitem__ 。本文阐述它们的区别和用法。 属性的访问机制 一般情况下,属性访问的默认行为是从对象的字典中获取,并...

    Python黑魔法之描述符

    本文我将讲述描述符的定义以及一些常见的场景,并且在文末会补充一下__getattr,__getattribute__,__getitem__这三个同样涉及到属性访问的魔术方法。只要一个objectattribute(对象属性)定义了上面三个方法中的任意一...

    getAttribute和getParameter区别.

    1.getAttribute是取得jsp中 用setAttribute設定的attribute 2.parameter得到的是string;attribute得到的是object 3.request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据;...

    getAttribute和getParameter区别

    getAttribute和getParameter区别 getAttribute和getParameter区别

    Python入门教程4. 元组基本操作 原创

    ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '...

    Python入门教程3. 列表基本操作【定义、运算、常用函数】 原创

    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__...

    js中的getAttribute方法使用示例

    getAttribute()方法 至此,我们已经向大家介绍了两种检索特定元素节点的办法:一种是使用getElementById()方法,另一种是使用getElementsByTagName()方法。在找到那个元素后,我们就可以利用getAttribute()方法把它...

    Python核心编程第二版

    很不错的python书 第1部分 Python核心  第1章 欢迎来到Python世界   1.1 什么是Python   1.2 起源   1.3 特点   1.3.1 高级   1.3.2 面向对象   1.3.3 可升级   1.3.4 可扩展   1.3.5 可...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

    原书名: Core Python Programming (2nd Edition) 原出版社: Prentice Hall PTR 作者: (美)Wesley J. Chun 译者: 宋吉广 出版社:人民邮电出版社 ISBN:9787115178503 上架时间:2008-6-23 出版日期:2008 ...

    Python入门教程5. 字典基本操作【定义、运算、常用函数】 原创

    ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

    原书名: Core Python Programming (2nd Edition) 原出版社: Prentice Hall PTR 作者: (美)Wesley J. Chun 译者: 宋吉广 出版社:人民邮电出版社 ISBN:9787115178503 上架时间:2008-6-23 出版日期:2008 ...

    浅谈python中的getattr函数 hasattr函数

    下面小编就为大家带来一篇浅谈python中的getattr函数 hasattr函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    初学者python笔记(类的内置属性)

    文章目录1、isinstance与issubclass判断方法2、__getattribute__方法3、item系列4、__str__与__repr__方法5、自定制格式化方法6、__doc__描述属性7、__del__析构8、__call__方法9、迭代器协议10、迭代器协议实现...

Global site tag (gtag.js) - Google Analytics