我想设置一个类,它将在实例创建期间根据传递给类的参数的值进行中止。我尝试了一些事情,其中一个是在__new__
方法中引发错误:
class a():
def __new__(cls, x):
if x == True:
return cls
else:
raise ValueError
这是我希望会发生的事情:
>>obj1 = a(True)
>>obj2 = a(False)
ValueError Traceback (most recent call last)
obj1
存在但obj2
没有。
有什么想法吗?
答案 0 :(得分:18)
当您覆盖__new__
时,别忘了拨打超级!
>>> class Test(object):
... def __new__(cls, x):
... if x:
... return super(Test, cls).__new__(cls)
... else:
... raise ValueError
...
>>> obj1 = Test(True)
>>> obj2 = Test(False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in __new__
ValueError
>>> obj1
<__main__.Test object at 0xb7738b2c>
>>> obj2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'obj2' is not defined
当你的工作创建一个实例时,简单地返回该类就什么都不做。这就是超类的__new__
方法所做的,所以要充分利用它。
答案 1 :(得分:5)
只需在初始化程序中引发异常:
class a(object):
def __init__(self, x):
if not x:
raise Exception()