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

31 投票
2 回答
19527 浏览
提问于 2025-04-16 05:02

我想创建一个类,这个类在实例化的时候会根据传入的参数值来决定是否终止创建。为了实现这个,我尝试了几种方法,其中一种是在 __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 个回答

9

在初始化的时候直接抛出一个异常:

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

当你重写 __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__ 方法就是用来做这个的,所以一定要好好利用它。

撰写回答