编写异常类时,我遇到了这个错误:
在这里有一个类似的问题:TypeError: object.__new__(int) is not safe, use int.__new__()。所以
[Python-Dev]
彻底失败。另一个例子:
TypeError: object.__new__(A) is not safe, use Exception.__new__()
在这里有一个类似的问题:TypeError: object.__new__(int) is not safe, use int.__new__()。所以
__new__
被弃用的原因如下:[Python-Dev]
__new__
deprecation但是,在3.3版本中我收到的警告“is not safe”让人感到不安。我试图理解使用Guido van Rossum
"这个消息的意思就是它所说的。:-)调用
object.__new__()
没有多余的参数,任何这样做的代码都只是把那些参数扔进了一个黑洞中。"
object.__new__
的影响,让我们考虑以下示例:>>> class A(Exception):
... def __new__(cls, *args):
... return object.__new__(A)
...
>>> A()
TypeError: object.__new__(A) is not safe, use Exception.__new__()
彻底失败。另一个例子:
>>> class A(object):
... def __new__(cls, *args):
... return object.__new__(A)
...
>>>
>>> A()
<__main__.A object at 0x0000000002F2E278>
工作正常。虽然object
和Exception
一样是内置类,但它们都具有内置类的特点。现在,使用Exception
,第一个示例会引发TypeError
错误,但是使用object
则不会?
(a) 使用object.__new__
的缺点是什么,导致Python在第一个示例中引发错误(TypeError:...is not safe...
)?
(b) Python在调用__new__
之前执行什么样的检查?或者说:在第一个示例中,Python引发错误的条件是什么?
object.__new__
中编码的。看看这段代码。也就是说,object.__new__
会引发TypeError
异常。现在说“不安全”非常合理。尽管如此,在子类中覆盖Exception.__new__
不会引发错误,即使在Subclass.__new__
内部没有调用Exception.__new__
,这同样是危险的。 - GIZ