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

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__的区别

    ### 详解 Python 中 `__get__` 和 `__getattr__` 与 `__getattribute__` 的区别 在 Python 编程语言中,对象的属性访问机制是非常灵活且强大的。当我们试图通过点号(`.`)操作符去访问一个对象的属性时,Python 会...

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

    在Python中,`__getattr__` 和 `__getattribute__` 都是用来处理对象属性访问的特殊方法,但它们在何时以及如何被调用上有显著的区别。了解这些区别对于编写更灵活、更具动态特性的代码至关重要。 首先,`__getattr...

    浅谈 Python 魔法函数 __getattr__ 与 __getattribute__

    在Python编程语言中,有一些特殊的内置方法被称为“魔法函数”(Magic Methods),它们通常以两个下划线开头和结尾,例如`__getattr__`和`__getattribute__`。这两个魔法函数都涉及到对象属性的访问,但它们在处理不...

    Python_让代码自己写.zip

    通过定义类的`__getattr__`、`__getattribute__`等特殊方法,我们可以控制对象属性的访问行为,甚至在访问不存在的属性时动态生成新的属性或方法。这样,我们可以构建出能够自我扩展的代码结构。 自动化工具在...

    python-3.8.0-docs-pdf-a4_Python3.8_python版本文档_python3.8文档_

    另外,`__getattr__`和`__getattribute__`方法的行为也有所调整,以提高类的灵活性。 在函数和类的定义上,Python 3.8.0允许在函数或方法定义后添加类型注解,如`def func(a: int) -> str:`,这为代码的自我文档化...

    基于Python __dict__与dir()的区别详解

    ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__...

    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特殊函数

    - **格式**:`def __getattribute__(self, attr):` - **示例**: ```python class MyClass: def __getattribute__(self, attr): if attr == "value": return super().__getattribute__("value") * 2 return ...

    python 常用方法

    - **`__getattribute__` 方法**:用于获取对象的所有属性,无论属性是否存在都会被调用。 ```python class CustomGetAttribute: def __getattribute__(self, name): return super().__getattribute__(name) `...

    python官方3.7.7-amd64版本exe安装包

    5. **行级执行历史**:`__getattr__`和`__getattribute__`方法现在可以查看调用堆栈,有助于调试。 6. **安全的`os.rename()`**:在某些情况下,`os.rename()`现在可以原子地替换现有文件,降低了数据丢失的风险。 ...

    Python中__new__与__init__方法的区别详解

    4. 新式类包含了`__getattribute__`方法,用于控制属性访问。 5. 新式类有`__new__`方法,经典类只有`__init__`方法。 `__new__`方法是类实例化过程中的第一个被调用的方法,它负责创建一个新的实例。这个方法接收...

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

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

    Python获取任意xml节点值的方法

    if e.getAttribute(key) != kwargs[key]: break else: return SimpleXmlGetter(e) ``` 在示例的主函数中,创建了一个`SimpleXmlGetter`对象`x`,然后使用点号(`.`)和方括号(`[]`)操作符来获取特定的节点值,...

    Python黑魔法之描述符

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

    浅谈Python由__dict__和dir()引发的一些思考

    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__...

    python3.6.5版本

    4. `__getattr__` 和 `__getattribute__` 方法的改进,使得动态属性访问更加灵活。 综上所述,Python 3.6.5 版本因其稳定性、性能优化以及对深度学习框架的良好支持,成为了众多开发者的选择。如果你正在进行深度...

Global site tag (gtag.js) - Google Analytics