2010-10-05 36 views
22

Tôi muốn thiết lập một lớp học sẽ hủy bỏ trong quá trình tạo cá thể dựa trên giá trị của đối số được chuyển đến lớp. Tôi đã thử một vài điều, một trong số họ là nâng cao một lỗi trong phương pháp __new__:Làm cách nào để hủy bỏ việc tạo đối tượng đối tượng bằng Python?

class a(): 
    def __new__(cls, x): 
     if x == True: 
      return cls 
     else: 
      raise ValueError 

Đây là những gì tôi đã hy vọng sẽ xảy ra:

>>obj1 = a(True) 
>>obj2 = a(False) 
ValueError Traceback (most recent call last) 

obj1 tồn tại nhưng không obj2 .

Bất kỳ ý tưởng nào?

+0

bạn không nên ghi đè '__init __ (self, ...)' thay thế? –

+0

@matt b. Nó không phải là ngữ nghĩa nếu sau đó ý định là để ngăn chặn việc tạo đối tượng. Nó hoạt động mặc dù. – aaronasterling

+0

@AaronMcSmooth: Tại sao việc tăng ngoại lệ trong '__new__' thích hợp hơn để tăng một trong' __init__'. Kết quả có vẻ giống với tôi và '__init__' là nơi tất cả các mã khởi tạo khác đi. Tại sao không nên đến đó? – Arlaharen

Trả lời

16

Khi bạn ghi đè __new__, đừng quên gọi cho siêu!

>>> 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 

Đơn giản chỉ cần trả lại lớp làm gì khi đó là công việc của bạn để tạo ra một ví dụ. Đây là phương thức của lớp siêu đẳng __new__, vì vậy hãy tận dụng nó.

+0

Nếu tôi cần x biến, tôi nên làm gì? – mertyildiran

3

Chỉ cần tăng một ngoại lệ trong initializer:

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

'__init__' không phải là hàm tạo, nó là bộ khởi tạo. Bạn đang nghĩ đến '__new__' – Daenyth

Các vấn đề liên quan