Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中中止对象实例创建?_Python_Object - Fatal编程技术网

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

如何在Python中中止对象实例创建?,python,object,Python,Object,我想设置一个类,该类将根据传递给该类的参数值在实例创建期间中止。我尝试了几种方法,其中一种是在\uuuu new\uuuu方法中引发错误: class a(): def __new__(cls, x): if x == True: return cls else: raise ValueError 这就是我希望发生的事情: >>obj1 = a(True) >>obj2 = a(Fa

我想设置一个类,该类将根据传递给该类的参数值在实例创建期间中止。我尝试了几种方法,其中一种是在
\uuuu new\uuuu
方法中引发错误:

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
不存在


有什么想法吗?

只要在初始值设定项中提出一个例外:

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

当您覆盖
\uuuu new\uuuu
时,别忘了调用super

>>> 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
>类测试(对象):
...     定义新定义(cls,x):
...         如果x:
...             返回超级(测试,cls)。\uuuu新建\uuuuuu(cls)
...         其他:
...             升值误差
... 
>>>obj1=测试(真)
>>>obj2=测试(错误)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第6行,新__
数值误差
>>>obj1
>>>obj2
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“obj2”

当您的任务是创建一个实例时,简单地返回类并没有任何作用。这就是超类的
\uuuuuu new\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。若意图是停止对象创建,那个么它并不是语义上的。不过它确实有效。@AaronMcSmooth:为什么在
\uuuuu new\uuuuu
中引发异常要比在
\uuuu init\uuuuu
中引发异常更好。结果在我看来是一样的,
\uuuu init\uuu
是所有其他初始化代码的所在。“为什么这个不也应该去那里呢?”阿拉哈伦。因为这不是初始化代码。它是条件构造代码。似乎
\uuuu init\uuuu
只有在初始化实例时遇到问题时才应该抛出异常。在这里,这是一个正在进行的显式测试。不过我可能只是在吹毛求疵。我想说,如果你想在初始值设定项中这样做,只要试着使用
x
就可以了,让它引发一个异常或通过。我真的认为人们通常会给出的建议是将
\uuu init\uuu
作为构造函数。如果出于任何原因需要中止对象的构造,那么在那里引发异常同样有效。重写
\uuuu new\uuuu
很少需要,对于日常的普通类,我认为应该避免。这样做可以使类实现简单。
\uuuu init\uuu
不是构造函数,而是初始值设定项。您正在考虑
\uuuu new\uuuu
如果我也需要x变量,我应该怎么做?