Я знаком с теорией о __new__
vs __init__
. Первый определяет, как создается экземпляр класса (новый объект внутри памяти), тогда как последний инициализирует его (присваивает начальные атрибуты состояния - поля). Существует несколько статей в Интернете об этом, например this one:Пример реального мира переопределения метода __new__ в Python
Используйте
__new__
, когда вам нужно контролировать создание нового экземпляра. Используйте команду__init__
, когда вам нужно управлять инициализацией нового экземпляра .
Как я уже сказал, я понимаю разницу, но я не могу себе представить реальный пример ситуации, когда мне нужно использовать __new__
вместо __init__
. Если я могу настроить что-то во время создания объекта, я могу перенести его на инициализацию объекта - пока это тот же объект. Упомянутая ссылка говорит:
В общем, вам не нужно переопределить
__new__
если вы не подклассов неизменного типа, как улица, межды, юникод или кортеж.
И вот идет мой вопрос - кто-то может привести пример ситуации, когда переопределение __new__
фактически является правильным решением, которое не может быть сделано с помощью __init__
и почему?
[Подклассификация кортежей Python с несколькими \ _ \ _ init \ _ \ _ аргументами] (http://stackoverflow.com/q/1565374) –
@MartijnPieters благодарит вас за ссылку, но в любом случае, я был бы признателен за реальную мировой пример. Я предполагаю, что когда вы создаете неизменяемый кортеж, вы не можете ничего с ним делать внутри __init__, поскольку по определению он неизменен. – ducin
'__new__' также полезен, когда вам нужно выполнять распределения уровня уровня. Например, у вас может быть пул неиспользуемых объектов, дорогостоящий для инициализации, поэтому, когда вам нужен новый, вы просто берете его оттуда, а не создаете полностью новый. – Davidmh