如何在Python中中止对象实例创建?

时间:2010-10-05 21:05:02

标签: python object

我想设置一个类,它将在实例创建期间根据传递给类的参数的值进行中止。我尝试了一些事情,其中​​一个是在__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没有。

有什么想法吗?

2 个答案:

答案 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()