Подтвердить что ты не робот

Как прервать создание экземпляра объекта в Python?

Я хочу создать класс, который будет прерван при создании экземпляра на основе значения аргумента, переданного классу. Я пробовал несколько вещей, один из которых вызывает ошибку в методе __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 не работает.

Любые идеи?

4b9b3361

Ответ 1

Когда вы переопределяете __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__, поэтому используйте его.

Ответ 2

Просто поднимите исключение в инициализаторе:

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