Вам нужно переопределить __new__
- убедитесь, что он принимает те же аргументы, что и __init__
:
class Test(object):
def __init__(self, value):
self.value = value
def __new__(cls, value):
if value > 1:
return object.__new__(cls)
return None
def __repr__(self):
return "Test value %d" % self.value
t1 = Test(2)
print repr(t1)
t2 = Test(1)
print repr(t2)
Python поддерживает возврат объектов различных типов из __new__
, но это довольно редкая практика.
В вашем случае, если вы выбираете между
if value < 1:
foo = None
else:
foo = Test(value)
и
foo = Test(value) # will None if value <= 1
и это то, что вы должны делать много раз, тогда я бы определенно подумал, чтобы класс сделал это.
В тех случаях, когда вы не можете контролировать new_object
, вы можете сделать свою собственную фабричную функцию:
def maybe_foo(value):
if value > 1:
return new_object(value)
return None