Python 3 __getattribute__ 与点访问行为

2024-06-01

我读了一些关于 python 的对象属性查找的内容(这里:https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/#object-attribute-lookup https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/#object-attribute-lookup).

看起来很简单,所以我尝试了一下(python3):

class A:
    def __getattr__(self, attr):
        return (1,2,3)

a = A()

a.foobar #returns (1,2,3) as expected
a.__getattribute__('foobar') # raises AttributeError

我的问题是,两者不应该是相同的吗?

为什么第二个会引发属性错误?

显然答案是逻辑a.foobar与以下逻辑不同a.__getattribute("foobar")。根据数据模型 https://docs.python.org/3.5/reference/datamodel.html#object.__getattribute__: a.foobar calls a.__getattribute("foobar")如果它引发 AttributeError,它会调用a.-__getattr__('foobar')

所以看来这篇文章的图表有错误。它是否正确?

还有一个问题:真正的逻辑在哪里?a.foobar坐?我以为是在__getattribute__但显然不完全是。

Edit: 不是重复的

__getattr__ 与 __getattribute__ 之间的区别 https://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute。 我在这里问有什么不同object.foo and object.__getattribute__("foo")。这不同于__getattr__ vs __getatribute__这是微不足道的...


很容易给人这样的印象__getattribute__所承担的责任比实际承担的要多。thing.attr不直接翻译为thing.__getattribute__('attr'), and __getattribute__不负责打电话__getattr__.

回退到__getattr__发生在属性访问机制外部的部分__getattribute__。属性查找过程如下:

  • 找出__getattribute__通过直接搜索对象类型的方法MRO https://www.python.org/download/releases/2.3/mro/,绕过常规属性查找过程。
  • Try __getattribute__.
    • If __getattribute__返回了一些东西,属性查找过程就完成了,这就是属性值。
    • If __getattribute__引发非 AttributeError,属性查找过程完成,并且异常从查找中传播出去。
    • 否则,__getattribute__引发了一个 AttributeError。查找仍在继续。
  • Find the __getattr__ method the same way we found __getattribute__.
    • 如果没有__getattr__,属性查找过程完成,并且 AttributeError 来自__getattribute__传播。
  • Try __getattr__,并返回或提高任何内容__getattr__回报或加薪。

至少,就语言语义而言,它是这样工作的。就低级实现而言,其中一些步骤可能会在不必要的情况下被优化,并且有类似的 C 钩子tp_getattro我还没有描述过。除非您想深入研究 CPython 解释器源代码,否则您无需担心此类事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 3 __getattribute__ 与点访问行为 的相关文章

  • Django:NoReverseMatch at /'myapp'不是注册的命名空间

    我在模板渲染期间遇到此错误 我想做的是允许用户上传 csv 然后将数据处理到模型中 第 109 行出错 myapp 不是已注册的命名空间 这是我的第 109 行代码
  • 创建一个支持 json 序列化的类以与 Celery 一起使用

    我正在使用 Celery 来运行一些后台任务 其中一项任务返回我创建的 python 类 考虑到有关使用 pickle 的警告 我想使用 json 来序列化和反序列化此类 有没有一种简单的内置方法可以实现这一目标 该类非常简单 它包含 3
  • Python Flask 删除请求

    我正在开发一个 Python 应用程序并使用 Flask 这是我的 DELETE 函数 app route DeleteMessage methods DELETE def DeleteMessage messages Message qu
  • Ruby 相当于 Python 的多处理模块是什么?

    为了在 Ruby 或 Python 中获得真正的并发性 我需要创建新的进程 Python 使用以下命令使这变得非常简单multiprocessing模块 它抽象了所有 fork wait 的好处 让我专注于我的代码 Ruby 有类似的东西吗
  • 在 PyCharm 中启用终端模拟

    很多人告诉过我和PyCharm 2 7 的 PyCharm 发行说明 https www jetbrains com pycharm whatsnew whatsnew 27 html吹捧那个PyCharm包括完整的终端仿真 我认为这是关于
  • 为什么Flask后台线程获取错误的数据库信息?

    为了将实时数据库信息推送到客户端 我在服务器端使用flask socketio 通过使用websocket将所有实时数据库信息推送到客户端 我的视图文件有一个片段 from models import Host from flask soc
  • python 函数 *args 和 **kwargs 以及其他指定的关键字参数

    我有一个 Python 类 它的方法应该以这种方式接受参数和关键字参数 class plot def init self x y self x x self y y def set axis self args xlabel x ylabe
  • 为什么我的字符串中出现不需要的换行符?

    这应该很简单 这很愚蠢 但我无法让它发挥作用 我有一个在读取文件时定义的标头 if gene env in line or gene HIV2gp7 in line header line 现在这个标题看起来像 gt lcl NC 0018
  • 如何为 PyYAML 编写代表程序?

    我想要一个自定义函数来序列化任意 python 对象 就像 json dump 函数有一个名为 default 的可选参数 如果对象不是 json 可序列化的 它应该是 json 转储器将调用的函数 我只是想从 json 包中执行相当于此操
  • 如何在 Google App Engine (Python) 中定义配置变量/常量?

    我是 python GAE 的新手 想知道如何快速定义和使用全局设置变量 所以说你 git 克隆我的 GAE 应用程序 然后打开config yaml 添加更改设置 应用程序就全部连接起来 如下所示 config yaml or whate
  • 将列表列表替换为“压缩”列表列表,同时保持顺序

    我有一个列表列表 如我所附的代码所示 如果有任何共同值 我想链接每个子列表 然后我想用列表的精简列表替换列表的列表 例子 如果我有一个清单 1 2 3 3 4 I want 1 2 3 4 如果我有 4 3 1 2 3 I want 4 3
  • dask分布式内存错误

    在分布式作业上运行 Dask 时 我在调度程序上遇到以下错误 distributed core ERROR Traceback most recent call last File usr local lib python3 4 dist
  • Python父类访问子私有变量

    以下代码会生成错误 class A object def say something self print self foo print self bar class B A def init self self foo hello sel
  • 折叠 numpy 数组除前两个维度之外的所有维度

    我有一个可变维度的 numpy 数组 例如它可以具有以下形状 64 64 64 64 2 5 64 64 40 64 64 10 20 4 我想要做的是 如果维数大于 3 我想将其他所有内容折叠 堆叠到第三维中 同时保留顺序 因此 在我上面
  • Python httplib 和 POST

    我目前正在使用别人编写的一段代码 它用httplib向服务器发出请求 它以正确的格式提供所有数据 例如消息正文 标头值等 问题是 每次尝试发送 POST 请求时 数据都在那里 我可以在客户端看到它 但没有任何内容到达服务器 我已经阅读了库规
  • 如何使用 opencv python 根据检测到的物体的位置生成其热图

    我需要根据对象的位置生成其热图 示例 视频帧中检测到的绿色球 如果它长时间停留在某个位置 那么该位置应该是红色的 并且球在短时间内经过的帧中的位置必须是蓝色的 这样我就需要生成热图 提前致谢 那么你在这里可以做的是 1 首先定义一个热图作为
  • 为什么变量 1 += 变量 2 比变量 1 = 变量 1 + 变量 2 快得多?

    我继承了一些 Python 代码 用于创建巨大的表 最多 19 列宽 5000 行 花了九秒用于在屏幕上绘制表格 我注意到每一行都是使用以下代码添加的 sTable sTable n GetRow where sTable是一个字符串 我将
  • Maya python 连接选择的属性

    我一直在尝试制作一个简单的脚本 它将采用两个视口选择 然后基本上将第二个视口的旋转连接到第一个 我不确定如何正确地从视口选择中为对象创建变量 这是我的尝试 但不起作用 import maya cmds as cmds sel cmds ls
  • 无法将 类型的对象转换为张量

    我正在编写一个使用 Flask 框架的客户端 python 文件 并在 docker 机器中运行它 因此 这需要一个输入文件并生成它的输出 但它会抛出无法转换为张量的错误 tf app flags DEFINE string server
  • 定义Python类时,如何在其中设置随机变量?

    假设我有一个名为Person 其中只有该人的姓名和性别 性别应从男性和女性中随机选择 为此 我导入random randint 功能 根据随机int确定随机性别 import random class Person alias random

随机推荐