Python: несколько вызовов __init __ () в одном экземпляре - PullRequest
10 голосов
/ 27 января 2010

Функция __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__() для уже созданного объекта?

хороший вопрос. я хочу заново инициализировать поля экземпляра.

Ответы [ 3 ]

11 голосов
/ 27 января 2010

Можно вызывать __init__ более одного раза для объекта, если __init__ закодирован с эффектом, который вы хотите получить (что бы это ни было). Типичный случай, когда это происходит (поэтому вам лучше кодировать __init__ соответственно! -), когда метод __new__ вашего класса возвращает экземпляр класса: делает , вызывая __init__ в возвращенном экземпляре (в течение, возможно, второго или двадцатого времени, если вы продолжаете «перерабатывать» экземпляры с помощью __new__! -).

3 голосов
/ 27 января 2010

Вы можете, но это своего рода нарушение того, для чего предназначен __init__. Большая часть Python на самом деле просто соглашение, так что вы можете также следовать и ожидать, что __init__ будет вызван только один раз. Я бы порекомендовал создать функцию с именем init или reset или что-то, что устанавливает переменные экземпляра, использовать ее, когда вы хотите сбросить экземпляр, и __init__ просто вызвать init. Это определенно выглядит более вменяемым:

x = Pt(1,2)
x.set(3,4)
x.set(5,10)
1 голос
/ 27 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...