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:
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 编程语言中,对象的属性访问机制是非常灵活且强大的。当我们试图通过点号(`.`)操作符去访问一个对象的属性时,Python 会...
在Python中,`__getattr__` 和 `__getattribute__` 都是用来处理对象属性访问的特殊方法,但它们在何时以及如何被调用上有显著的区别。了解这些区别对于编写更灵活、更具动态特性的代码至关重要。 首先,`__getattr...
在Python编程语言中,有一些特殊的内置方法被称为“魔法函数”(Magic Methods),它们通常以两个下划线开头和结尾,例如`__getattr__`和`__getattribute__`。这两个魔法函数都涉及到对象属性的访问,但它们在处理不...
通过定义类的`__getattr__`、`__getattribute__`等特殊方法,我们可以控制对象属性的访问行为,甚至在访问不存在的属性时动态生成新的属性或方法。这样,我们可以构建出能够自我扩展的代码结构。 自动化工具在...
另外,`__getattr__`和`__getattribute__`方法的行为也有所调整,以提高类的灵活性。 在函数和类的定义上,Python 3.8.0允许在函数或方法定义后添加类型注解,如`def func(a: int) -> str:`,这为代码的自我文档化...
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__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
- **格式**:`def __getattribute__(self, attr):` - **示例**: ```python class MyClass: def __getattribute__(self, attr): if attr == "value": return super().__getattribute__("value") * 2 return ...
- **`__getattribute__` 方法**:用于获取对象的所有属性,无论属性是否存在都会被调用。 ```python class CustomGetAttribute: def __getattribute__(self, name): return super().__getattribute__(name) `...
5. **行级执行历史**:`__getattr__`和`__getattribute__`方法现在可以查看调用堆栈,有助于调试。 6. **安全的`os.rename()`**:在某些情况下,`os.rename()`现在可以原子地替换现有文件,降低了数据丢失的风险。 ...
4. 新式类包含了`__getattribute__`方法,用于控制属性访问。 5. 新式类有`__new__`方法,经典类只有`__init__`方法。 `__new__`方法是类实例化过程中的第一个被调用的方法,它负责创建一个新的实例。这个方法接收...
python的提供一系列和属性访问有关的特殊方法: __get__ , __getattr__ , __getattribute__ , __getitem__ 。本文阐述它们的区别和用法。 属性的访问机制 一般情况下,属性访问的默认行为是从对象的字典中获取,并...
if e.getAttribute(key) != kwargs[key]: break else: return SimpleXmlGetter(e) ``` 在示例的主函数中,创建了一个`SimpleXmlGetter`对象`x`,然后使用点号(`.`)和方括号(`[]`)操作符来获取特定的节点值,...
本文我将讲述描述符的定义以及一些常见的场景,并且在文末会补充一下__getattr,__getattribute__,__getitem__这三个同样涉及到属性访问的魔术方法。只要一个objectattribute(对象属性)定义了上面三个方法中的任意一...
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__...
4. `__getattr__` 和 `__getattribute__` 方法的改进,使得动态属性访问更加灵活。 综上所述,Python 3.6.5 版本因其稳定性、性能优化以及对深度学习框架的良好支持,成为了众多开发者的选择。如果你正在进行深度...