2014-06-09 2 views
2

Я знаком с теорией о __new__ vs __init__. Первый определяет, как создается экземпляр класса (новый объект внутри памяти), тогда как последний инициализирует его (присваивает начальные атрибуты состояния - поля). Существует несколько статей в Интернете об этом, например this one:Пример реального мира переопределения метода __new__ в Python

Используйте __new__, когда вам нужно контролировать создание нового экземпляра. Используйте команду __init__, когда вам нужно управлять инициализацией нового экземпляра .

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

В общем, вам не нужно переопределить __new__ если вы не подклассов неизменного типа, как улица, межды, юникод или кортеж.

И вот идет мой вопрос - кто-то может привести пример ситуации, когда переопределение __new__ фактически является правильным решением, которое не может быть сделано с помощью __init__ и почему?

+1

[Подклассификация кортежей Python с несколькими \ _ \ _ init \ _ \ _ аргументами] (http://stackoverflow.com/q/1565374) –

+0

@MartijnPieters благодарит вас за ссылку, но в любом случае, я был бы признателен за реальную мировой пример. Я предполагаю, что когда вы создаете неизменяемый кортеж, вы не можете ничего с ним делать внутри __init__, поскольку по определению он неизменен. – ducin

+0

'__new__' также полезен, когда вам нужно выполнять распределения уровня уровня. Например, у вас может быть пул неиспользуемых объектов, дорогостоящий для инициализации, поэтому, когда вам нужен новый, вы просто берете его оттуда, а не создаете полностью новый. – Davidmh

ответ

2

Singletone pattern - наиболее очевидный пример. Когда вы создали еще один объект - это не одиночный, не так ли? Таким образом, вы должны справиться с этим, когда вы создаете свой объект. Один вариант решения - использовать метод __new__().

+0

пример [здесь] (http://stackoverflow.com/questions/42558/python-and-the-singleton -шаблон) –

Смежные вопросы