为什么 `instance_of_object.foo is instance_of_object.foo` 的计算结果为 False? [复制]

2023-12-19

如果我有一个

class A:
  def foo(self):
    pass

这评估为True:

getattr(A, 'foo') is A.foo

但这评估为False:

a = A()
getattr(a, 'foo') is a.foo

as does

a.foo is a.foo

Why?

我找到getattr(a, 'foo') and a.foo两者都由

<bound method A.foo of <__main__.A object at 0x7a2c4de10d50>>)

所以没有任何提示......


至少在 CPython 中,绑定方法是作为类的实例实现的method。每次你询问绑定函数的值时,你都会得到一个new这个类的实例。

x = a.foo
y = a.foo

assert x is not y
id(x)  # E.g. 139664144271304
id(y)  # E.g. 139664144033992
type(x)  # <class 'method'>
type(y)  # <class 'method'>

这个类所做的只是存储对实例的引用和unbound函数,当您调用该类时,它会使用存储的实例(以及其他参数)调用未绑定的函数。

未绑定的函数,例如A.foo,只是常规的旧函数 - 没有构建代理类的新实例,因此身份按您的预期工作。

造成这种差异的原因是语义a.foo依赖于取决于two事物、事物的价值a和价值A.foo。为了能够在以后的任何时间点获得这个含义,这两个值都需要存储。这就是method类确实如此。

反之,其含义为A.foo仅取决于一个值:A.foo。因此不需要额外的工作来存储任何内容,并且使用值本身。

您可能会考虑预分配绑定方法实例的想法,以便a.foo总是返回相同的不可变对象 - 但考虑到 Python 的动态特性,每次构造一个新对象会更简单、更便宜,即使它们可能是相同的。

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

为什么 `instance_of_object.foo is instance_of_object.foo` 的计算结果为 False? [复制] 的相关文章

随机推荐

  • 将手表套件应用程序部署到设备时出现“Apple Watch 应用程序的安装从未完成”错误

    所以我得到了我的新手表 耶 我手动将其 UDID 添加到开发人员门户并刷新配置文件 并且我能够将存档推送到 ITC 进行测试 但现在我想在我的手表本身上以调试方式运行该应用程序 我尝试将手表套件应用程序目标设置为我的手机作为设备部署 它就在
  • 从 Angular NGXS 中的不同组件搜索数据

    我试图弄清楚如何从不同的组件中搜索 NGXS 当我从应用程序组件 这是一个不同的组件 显示我的数据时 我有来自导航栏组件的搜索栏 请参阅此 stackblitz 链接点击这里 https stackblitz com edit ngxs s
  • .NET Core 2 - 带有实例名称和端口号的连接字符串

    在我的应用程序中 我的配置中有一个连接字符串 该应用程序使用 NET core 2 11 和 SQL Server 创建 这是连接字符串 Data Source servername instancename portnumber Init
  • 制作一个seaborn线图,为每个点指定标准差/置信区间

    我正在尝试制作一个具有平滑的置信区间的线图 看起来像这样的东西 source pydata org https seaborn pydata org images seaborn lineplot 1 png 目前 我所做的是使用误差线来显
  • aspnet5 vNext (rc1) iis 8 - 错误网关 502.3

    我意识到存在这样的帖子 我已经阅读 重新阅读但仍然遇到问题 大多数都是旧的或不直接相关的 所以我想我应该重新发布当前的示例 尝试在 Windows Server 2012 R2 上的 IIS 8 5 中运行基本站点 此时我陷入了 502 3
  • 垂直分屏自定义形状

    I want to make a vertical split screen with a custom shape like in my attached image But it must be cross browser suppor
  • JavaScriptSerializer 将对象“集合”反序列化为对象失败的属性

    我有一个 js 对象 结构如下 object property1 some string object property2 some string object property3 property1 some string object
  • 复制整个目录但排除一些文件 php

    试图找到一种复制整个目录但排除某些文件的方法 在这种情况下只需要排除一个始终只包含 1 个 png 文件的目录 我想可以使用类似于此代码的内容 但绝对没有任何线索如何仅排除一个文件 function xcopy source dest pe
  • 堆地址范围内全局变量的地址

    我正在调试MPlayer 1 3 0源代码 我看到一个全局变量 其地址 由GDB甚至简单的打印 都在堆分配的范围内 而不是数据部分 我使用检查了堆范围procfs 555555554000 555555834000 r xp 0000000
  • Firefox VIEW SOURCE 显示登录页面

    我在 Arch Linux 上运行 Firefox 61 0 查看页面源代码时 当我浏览需要登录的网站时 我经常 但并非总是如此 估计有 20 的时间 会看到登录页面的源代码 当我浏览本地主机 每个页面的源代码都是在服务器上生成的 这不是操
  • 你能在 Python 中的核心类型上猴子修补方法吗?

    Ruby 可以向 Number 类和其他核心类型添加方法以获得如下效果 1 should equal 1 但Python似乎无法做到这一点 这是真的 如果是这样 为什么 这是否与以下事实有关 type不能修改吗 我不想讨论猴子修补的不同定义
  • 如何在 obj-c 中打印格式化的浮点数?

    如何打印float在 Objective C 中 例如 3 45代替3 45555555555 尝试像这样格式化浮动 NSLog 2f myFloat The 符号表示这将被下面的相应参数替换 myFloat The 2表示小数点后 2 位
  • 是否可以在 Artifactory 中重命名存储库?

    我们想引入一种命名约定 因为我们有大量的内部和外部存储库 因此我们希望让人们清楚什么是什么 添加这些存储库时 没有人预计事情会增长这么多 我想知道是否可以重命名存储库 我知道我可以创建新的并复制 移动其中的工件 但这看起来比我想要的要付出更
  • Automake:构建不被安装的共享模块

    如何告诉Automake构建一个不被安装的动态模块 pkglib LTLIBRARIES mywrapper la mywrapper la LDFLAGS no undefined module avoid version 导致 mywr
  • 如何在 C# 中保存随机生成器的状态? [复制]

    这个问题在这里已经有答案了 出于测试目的 我使用给定的种子创建随机数 即不基于当前时间 因此整个程序是确定性的 如果发生什么事情 我希望能够快速恢复到事件发生 不久之前 的点 因此我需要能够恢复System Random到之前的状态 有没有
  • Babel 对 Object.entries 的支持

    我正在看Object values Object entries 的第 3 阶段提案 https github com tc39 proposal object values entries我真的很想在我当前的 JavaScript 项目中
  • 过桥拼图

    晚上必须有四个人过桥 任何人过桥 无论是一个人还是两个人 都必须随身携带手电筒 必须用手电筒来回走动 每个人行走的速度不同 一个需要 1 分钟 另一个需要 2 分钟 另一个需要 5 分钟 最后 10 分钟 如果两个人一起穿过 他们必须以较慢
  • 将列表中连续出现的相同重复项目分组

    例如 我们有一个这样的列表 L item1 item2 item3 item3 item3 item1 item2 item4 item4 item4 我想将它们打包到以下形式的元组列表中 item1 1 item2 1 item3 3 i
  • 如何过期或重置地理位置

    当用户访问我的网站时 我会检查是否在 PHP 中设置了位置会话 如果没有设置与用户位置的会话 我将它们重定向到 www domain net location 在此页面上有许多选项供用户选择位置 如果浏览器允许 选项之一是使用浏览器进行设置
  • 为什么 `instance_of_object.foo is instance_of_object.foo` 的计算结果为 False? [复制]

    这个问题在这里已经有答案了 如果我有一个 class A def foo self pass 这评估为True getattr A foo is A foo 但这评估为False a A getattr a foo is a foo as