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__()
不会被覆盖,反之亦然。
考虑用例:
-
当两者都没有被覆盖时,我们希望听到关于多余(即任何)参数的抱怨,因为它们的存在可能表明存在
漏洞。
-
当定义 Immutable 类型时,我们很可能只重写__new__()
, since __init__()
被调用太晚而无法初始化
不可变的对象。自从__new__()
定义签名
类型,必须重写会很痛苦__init__()
只是为了停下来
它来自于抱怨过多的争论。
-
当定义可变类型时,我们可能只覆盖__init__()
。所以这里适用相反的推理:我们不想要
必须覆盖__new__()
只是为了阻止它抱怨。
-
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(使用前将#替换为@)