2010-10-05 80 views
22

我想建立一个类,它会在创建实例时根据传递给类的参数的值来中止。我已经尝试了几件事,其中之一是在__new__方法引发错误:如何中止Python中的对象实例创建?

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

不应该重写'__init __(self,...)'而不是? – 2010-10-05 21:12:11

+0

@matt b。如果意图是停止创建对象,那么它就不是语义。它确实工作。 – aaronasterling 2010-10-05 21:28:29

+0

@AaronMcSmooth:为什么在'__new__'中引发异常比在__init__中引发异常要好。结果对我来说看起来是一样的,'__init__'是所有其他初始化代码所在的地方。为什么不应该去那里呢? – Arlaharen 2010-10-05 22:04:35

回答

16

当您覆盖__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__方法所做的,所以请充分利用它。

+0

如果我也需要x变量,我该怎么办? – mertyildiran 2016-03-12 23:17:15

3

在初始化只是抛出一个异常:

class a(object): 
    def __init__(self, x): 
     if not x: 
      raise Exception() 
+1

'__init__'不是构造函数,它是初始值设定项。你正在考虑'__new__' – Daenyth 2010-10-05 21:20:20