为什么 object.__new__ 在这两种情况下工作方式不同?

2023-11-26

Python 版本:“'2.7.3(默认,2013 年 4 月 10 日,06:20:15)\n[GCC 4.6.3]'”

我有这个:

>>> class testclass1(object):
    ...     pass
    ... 

>>> class testclass2(object):
    ...     def __init__(self,param):
    ...             pass
    ... 

>>> a = object.__new__(testclass1, 56)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: object.__new__() takes no parameters

>>> b = object.__new__(testclass2, 56)

>>> b
    <__main__.testclass2 object at 0x276a5d0>

还有一些更好玩的!与上面testclass1的结果进行比较。

>>> class testclass3(object):
    ...     def __init__(self):
    ...             pass
    ... 

>>> c = object.__new__(testclass3, 56)

>>> c
    <__main__.testclass3 object at 0x276a790>

>>> c1 = object.__new__(testclass3)

>>> c1
    <__main__.testclass3 object at 0x276a810>

我的问题是how does(不是为什么)object__new__在这两种情况下表现不同吗? 另请注意,在第一种情况下,该错误有点误导,因为在第二种情况下object.__new__最终确实发生了争论!


Both object.__new__ and object.__init__通过精心构建的条件迷宫,在某些情况下允许过多的参数,在其他情况下引发错误,并在非常具体的情况下提出警告。实现检查的代码很容易理解,但如果没有的话,其背后的推理可能仍然难以理解这个解释性评论:

你可能想知道为什么object.__new__()只抱怨争论 什么时候object.__init__()不会被覆盖,反之亦然。

考虑用例:

  1. 当两者都没有被覆盖时,我们希望听到关于多余(即任何)参数的抱怨,因为它们的存在可能表明存在 漏洞。

  2. 当定义 Immutable 类型时,我们很可能只重写__new__(), since __init__()被调用太晚而无法初始化 不可变的对象。自从__new__()定义签名 类型,必须重写会很痛苦__init__()只是为了停下来 它来自于抱怨过多的争论。

  3. 当定义可变类型时,我们可能只覆盖__init__()。所以这里适用相反的推理:我们不想要 必须覆盖__new__()只是为了阻止它抱怨。

  4. When __init__()被覆盖,并且子类__init__() calls object.__init__(),后者应该抱怨过多 论据;同上__new__().

用例 2 和 3 使得无条件检查没有吸引力 多余的论点。解决所有四个用例的最佳解决方案 如下:__init__()抱怨过多的争论,除非__new__()被覆盖并且__init__()不被覆盖(IOW,如果__init__()被覆盖或__new__()没有被覆盖); 对称地,__new__()抱怨过多的争论,除非__init__()被覆盖并且__new__()不被覆盖(IOW,如果__new__()被覆盖或__init__()没有被覆盖)。

但是,为了向后兼容,这会破坏太多代码。 因此,在 2.6 中,我们将warn关于多余的争论,当双方 方法被重写;对于所有其他情况,我们将使用上述规则。

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

为什么 object.__new__ 在这两种情况下工作方式不同? 的相关文章

随机推荐

  • jquery animate 用于元素属性而不是样式

    ASAIK jquery animate 函数仅接受样式属性 但我想为元素的属性设置动画 考虑一个 SVG 元素矩形
  • Django/Python 初学者:执行 python manage.pysyncdb 时出错 - psycopg2 未找到

    我使用 Macports 安装了 Pythong2 6 psycopg2 和 pgAdmin3 我的settings py是 DATABASE ENGINE postgresql psycopg2 postgresql psycopg2 p
  • Rust 借用了指针和生命周期

    在我的代码中 我有一个相互递归的树结构 如下所示 enum Child lt r gt A r Node lt r gt B C struct Node lt r gt children r Child lt r gt 25 impl lt
  • 如何从 GIF 动画中获取长度(时间)

    有没有办法知道单循环 GIF 动画需要多长时间才能完成 好吧 具体细节取决于您使用什么接口来操作这些动画 GIF 我不知道本机 Java AWT Swing 中是否有真正流畅的方式 但是基本思想是计算 帧速率 数量 帧数 如果您正在手动编写
  • pymc3:多个观察值

    我有一些观测数据想要估计参数 我认为这将是尝试 PYMC3 的好机会 我的数据由一系列记录构成 每条记录包含一对与固定的一小时时间段相关的观察结果 一项观察是给定一小时内发生的事件总数 另一个观察结果是该时间段内的成功数量 例如 一个数据点
  • 替代 VSS 进行单人表演(一人军队?)

    我已经为同一个雇主编程了 10 多年 我们唯一使用过的源代码控制是 VSS 抱歉 这就是我开始时他们所拥有的 曾经只有我们几个人 现在有两个 我们通常单独工作 所以 VSS 对我们来说工作得很好 所以 我有两个问题 1 我们是否应该切换到其
  • OpenXML 将段落样式(标题 1、标题 2、标题 3 等)添加到字处理文档

    谁能指导我如何使用开放 XML 字处理在段落上添加预定义样式 我尝试过论坛上提供的各种解决方案 但对我来说没有任何作用 这是我想要完成的任务 Create a document by supplying the filepath Wordp
  • 按钮上方滚动文本,按钮固定在底部

    我很难在 Android 应用程序中获得我想要的 GUI 布局结果 我想要的简要描述 GUI 将包括两个 TextView 和四个按钮 四个按钮水平排列 位于同一行 并固定在屏幕右下角 两个 TextView 中的第一个从屏幕顶部开始 文本
  • 如何使用运行时参数在 Scala 中创建单例对象

    我正在尝试使用运行时指定的参数创建一个单例对象 例子 object NetworkPusher val networkAdress 想象一下 networkAdress 参数来自命令行 我该如何制定解决方法来做到这一点 单例是延迟初始化的
  • 使用 Hibernate 处理文本文件

    我在用休眠在 Java 应用程序中访问我的数据库 它与 MS SQL 和 MySQL 配合得很好 但是我必须在某些表单上显示的一些数据必须来自文本文件 我所说的文本文件是指人类可读的文件 它们可以是 CSV 制表符分隔 甚至是每行的键 值对
  • 如何让顶级git跟踪另一个子目录git下的所有文件

    命令序列 mkdir 顶目录mkdir another git directory触摸文件C触摸屏Dgit 添加 git commit m 子目录初始化 cd 触摸文件触摸文件Bgit 添加 git commit m 顶层目录初始化 git
  • Spring事务不回滚

    我们遇到了 Spring 事务回滚问题 回滚似乎不起作用 在我的服务层方法中 注释为 Transactional我叫三个不同的DAOImpl类插入3条记录 中间插入从第四个表中获取数据以填充描述字段 但这失败了 我预计第一个插入会回滚 但似
  • 使用 pip 将 Python 包安装到不同的目录中?

    我知道明显的答案是使用 virtualenv 和 virtualenvwrapper 但由于各种原因我不能 不想这样做 那么如何修改命令 pip install package name to make pip将软件包安装在默认位置以外的位
  • 如何解决 wsdl2java 上 ObjectFactory 中的冲突?

    我在用着CXF and wsdl2java自动生成Web服务类 问题 不知何故 我想要连接的网络服务的某些元素有重复的名称 Two declarations cause a collision in the ObjectFactory cl
  • 获取 java.time.chrono.HijrahDate 实例的月份名称

    HijrahDate hd HijrahChronology INSTANCE date LocalDate of 2014 11 25 如果我们有HijrahDate实例 预计有一个方法UmalquraCalendar API显示月份名称
  • 我可以将 Must_use 应用于函数结果吗?

    我有一个函数返回一个f64 我想确保使用该函数的输出 而不是仅仅忽略它 有什么办法可以做到这一点吗 返回类型不用于错误处理 因此将其包装在Result or Option确实没有意义 我想要类似的东西 must use fn calcula
  • 两个 .net 程序集之间的循环引用

    我有两个程序集 A 和 B A 已存在对 B 的引用 并且必须保持这种状态 现在我对B做了一些修改 需要引用A 所以就出现了循环引用 一些细节 A 有一些属性网格 B 中的对话框需要托管这些属性网格 因此 为了避免这种循环引用问题 我尝试在
  • 交换字符串中的字母

    我需要按照以下规则交换字符串中的字母 A 被 T 取代 T 被替换为 A C 被 G 取代 G 被 C 取代 例如 ACGTA应该成为TGCAT 解决这个问题的最佳方法是什么 正在寻找java A to T T to A 找到了这个建议 S
  • 如何调试/记录 wsgi python 应用程序?

    我试过这个 usr bin python from wsgiref simple server import make server from cgi import parse qs escape import logging import
  • 为什么 object.__new__ 在这两种情况下工作方式不同?

    Python 版本 2 7 3 默认 2013 年 4 月 10 日 06 20 15 n GCC 4 6 3 我有这个 gt gt gt class testclass1 object pass gt gt gt class testcl