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

Повторно инициализировать объект самостоятельно.__ init __ (...)

Может ли кто-нибудь объяснить, можно ли повторно инициализировать объект, вызвав "self. init (". как показано на следующем упрощенном примере?

Причина, по которой я спрашиваю, заключается в том, что я не мог найти этот метод ни в нескольких книгах python, ни в Интернете. Есть некоторые, которые предлагают перечислить все атрибуты и установить их на начальное значение по одному. В принципе, я хочу установить свой объект в начальное состояние после того, как он выполнил некоторые задачи.

class Book(object):
    def __init__(self,name,author):
        self.name = name
        self.author = author
        self.copies = 5

    def reset(self):
        self.__init__(self.name,self.author)

    def incrementCopy(self):
        self.copies += 1

Kite = Book('kite runner','khaled hosseini')

print 'initial number of copies:', Kite.copies
Kite.incrementCopy()
Kite.incrementCopy()
Kite.incrementCopy()
print '3 copies are added:', Kite.copies
Kite.reset()
print 'number of copies are reinitialized', Kite.copies


initial number of copies: 5
3 copies are added: 8
number of copies are reinitialized 5
4b9b3361

Ответ 1

Единственная особенность __init__ заключается в том, что она вызывается автоматически при создании экземпляра. Кроме этого, это обычный метод, и безопасно использовать его, чтобы вернуть объект в исходное состояние.

Говоря это, только потому, что это безопасно, это не значит, что это хорошая идея. Другие люди, смотрящие на ваш код, могут быть смущены этим, и нетрудно все это сделать в методе reset (который __init__ может даже вызвать), чтобы более подробно описывать, как этот метод используется.

Ответ 2

Я считаю это очень плохой практикой - вы не должны __init__ вручную (если не вызывать __init__ родительского класса). Кроме того, передача данных объекта обратно в __init__ несколько странная.

Почему бы не что-то вроде этого:

class Book(object):
    def __init__(self,name,author):
        self.name = name
        self.author = author
        self.reset()

    def reset(self):
        self.copies = 5