编码异常类,我遇到了这个错误:
TypeError: object.__new__(A) is not safe, use Exception.__new__()
这里有一个类似的问题:
TypeError:object .__ new __(int)不安全,使用int .__ new __().所以__new__因以下原因而被弃用:
Guido van Rossum
"这条消息意味着它所说的内容.:-)调用
object.__new__()多个类参数是没有意义的 ,任何这样做的代码都只是将这些args转移到一个黑洞中."
但我在3.3中发出的"不安全"的警告是可怕的.我试着理解使用的含义object.__new__,让我们考虑一下这个例子:
>>> class A(Exception):
... def __new__(cls, *args):
... return object.__new__(A)
...
>>> A()
TypeError: object.__new__(A) is not safe, use Exception.__new__()
Run Code Online (Sandbox Code Playgroud)
悲惨地失败.另一个例子:
>>> class A(object):
... def __new__(cls, *args):
... return object.__new__(A)
...
>>>
>>> A()
<__main__.A object at 0x0000000002F2E278>
Run Code Online (Sandbox Code Playgroud)
工作良好.虽然,object就像Exception他们的角色一样,它是一个内置类,但它们共享内置类的特性.现在Exception,第一个例子提出TypeError,但是 …
所以,我今天才意识到__new__,从python 2.6开始,对于接收参数已被弃用了(文档中没有提到它,就我所看到的__new__调用行为而言,这也是不正确的__init__).这意味着我的功能代码已经开始发出警告,我想摆脱它们.但我看不出一种优雅的解决方法.
我有一堆类在构造时执行优化.所以我有
class Conjunction(Base):
def __new__(cls, a, b):
if a == True:
return b
elif b == True
return a
else:
return super(Conjunction,cls).__new__(cls, a, b)
Run Code Online (Sandbox Code Playgroud)
等等(真实版本涵盖更多案例).因此,与Guido在此响应中所说的不同(我可以找到它的唯一引用),我的__new__方法确实使用了它的参数,并且不能被重写的__init__函数替换.
我能做的最好的就是把它分成两部分:
def Conjunction(a, b):
if a == True:
return b
elif b == True
return a
else:
return ConjunctionImpl(a, b)
class ConjunctionImpl(Base):
# ...
Run Code Online (Sandbox Code Playgroud)
但这很丑陋,对高天堂很臭.我是否缺少一种优雅的方法让类构造函数根据给定的构造函数参数返回一些任意对象?