Сам удаляющий экземпляр
Можно ли сделать вызов класса del()
для некоторых экземпляров при некоторых условиях? Или превратите себя в None?
class T:
def __init__(self, arg1, arg2):
condition=check_condition(arg1,arg2)
if not condition:
do_something(arg1)
else:
del(self) #or self=None or return None
Мне нужно сделать что-то подобное, чтобы быть уверенным, что никогда не будет такого экземпляра.
Ответы
Ответ 1
Мне нужно сделать что-то подобное, чтобы быть уверенным, что никогда не будет такого экземпляра.
Если вы просто хотите предотвратить создание такого экземпляра, создайте исключение в __init__()
всякий раз, когда выполняется условие.
Это стандартный протокол для сбоев конструктора сигнализации. Для дальнейшего обсуждения см. Python: это плохая форма для того, чтобы создавать исключения из __init__?
Ответ 2
Посмотрите __new__
. Вы должны быть в состоянии определить состояние, о котором вы заботитесь, и вернуть None
. Как отмечает @lzkata в комментариях, повышение Exception
, вероятно, является лучшим подходом.
Ответ 3
Вы можете создать исключение, как это предлагается в комментариях. Вы можете реализовать __new__
. Также вы можете создать класс factory, например
class TFactory:
def createT(self, arg1, arg2):
condition=check_condition(arg1,arg2)
if not condition:
return do_something(arg1)
else:
return None
Ответ 4
Да, вы можете назвать del self. он работает отлично, но вы должны знать, что все, что он делает, это удаление ссылки на экземпляр с именем "self" в методе init.
В python объекты существуют до тех пор, пока в них есть ссылка.
Если вы хотите, чтобы объект никогда не существовал при определенных условиях, никогда не пытайтесь создать экземпляр в этих условиях вне init, где вы создаете объект.
Кроме того, вы можете определить полезную функцию в этом классе, чтобы вернуть, выполняются ли эти условия.
Ответ 5
Конструктор класса предназначен для того, чтобы действительно построить экземпляр своего класса и не терпеть неудачу наполовину молча, просто не создав экземпляр и не вернув None. Никто не ожидал такого поведения.
Скорее используйте функцию factory.
class Test(object):
@classmethod
def create(cls):
if ok(): return cls()
else: return None