2010-10-05 40 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

相關問題