Сам удаляющий экземпляр

Можно ли сделать вызов класса 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