tags:

views:

110

answers:

3

I want to set up a class that will abort during instance creation based on the value of the the argument passed to the class. I've tried a few things, one of them being raising an error in the __new__ method:

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

This is what I was hoping would happen:

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

obj1 exists but obj2 doesn't.

Any ideas?

+1  A: 

Just raise an exception in the initializer:

class a(object):
    def __init__(self, x):
        if not x:
            raise Exception()
Arlaharen
`__init__` is not the constructor, it is the initializer. You're thinking of `__new__`
Daenyth
this works too. not as nice though
aaronasterling
+5  A: 

When you override __new__, dont forget to call to 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

Simply returning the class does nothing when it was your job to create an instance. This is what the super class's __new__ method does, so take advantage of it.

aaronasterling
A: 

These solutions work, but what if I add some more? How would you handle the exception such that the user gets a warning and the object isn't created:

class Test(object):
    def __new__(cls, x):
        try:
            if x:
                return super(Test, cls).__new__(cls)
            else:
                raise ValueError
        except:
            print "exception"

In this case an object of "NoneType" is created.

moorepants