Питон:несколько вызовов __init__() в одном экземпляре
-
23-09-2019 - |
Вопрос
А __init__()
функция вызывается при создании объекта.Можно ли вызвать объект __init__()
функция снова, после ее создания?
instance = cls(p1=1, p2=2)
# some code
instance.__init__(p1=123, p2=234)
# some more code
instance.__init__(p1=23, p2=24)
зачем кому-то звонить __init__()
на уже созданном объекте?
хороший вопрос.я хочу повторно инициализировать поля экземпляра.
Решение
Это нормально, позвонить __init__
более одного раза на объекте, пока __init__
закодирован с эффектом, который вы хотите получить (каким бы он ни был).Типичный случай, когда это происходит (поэтому вам лучше написать код __init__
соответственно!-) это когда твой класс __new__
метод возвращает экземпляр класса:что делает причина __init__
быть вызван на возвращаемом экземпляре (это может быть второй или двадцатый раз, если вы продолжаете «перерабатывать» экземпляры через свой __new__
!-).
Другие советы
Можно, но это как бы ломает то, что __init__
намерен сделать.Большая часть Python на самом деле является просто соглашением, поэтому вы можете следовать ему и ожидать __init__
вызываться только один раз.Я бы рекомендовал создать функцию под названием init
или reset
или что-то, что устанавливает переменные экземпляра, используйте это, когда хотите сбросить экземпляр, и имейте __init__
просто позвони init
.Это определенно выглядит более разумно:
x = Pt(1,2)
x.set(3,4)
x.set(5,10)
Насколько я знаю, никаких проблем это не вызывает(редактировать: как предполагает кошерное использование super(...).__init__(...)
), но я думаю, что наличие reset()
метод и вызов его как в __init__()
и при необходимости перезагрузки будет чище.