Я искал, и я не в состоянии придумать какой-либо уважительной причины, чтобы использовать в Python __enter__
/__exit__
, а не __init__
(или __new__
?)/__del__
.Python __enter__/__exit__ против __init__ (или __new__)/__del__
Я понимаю, что __enter__
/__exit__
предназначен для использования с with
заявления в качестве менеджеров контекста, а with
утверждения велико. Но аналогичным тому, что любой код в этих блоках только, выполненный в этом контексте. Используя их вместо __init__
/__del__
Я, кажется, создаю неявный контракт с абонентами, что они должны использовать with
, но нет никакого способа обеспечить выполнение такого контракта, и контракт передается только через документацию (или чтение кода). Это похоже на плохую идею.
Я, кажется, получаю тот же эффект, используя __init__
/__del__
внутри блока with
. Но, используя их, а не методы управления контекстом, мой объект также полезен в других сценариях.
Может ли кто-нибудь придумать вескую причину, почему я бы когда-либо хотел использовать методы управления контекстом, а не методы конструктора/деструктора?
Если есть лучшее место, чтобы задать такой вопрос, пожалуйста, дайте мне знать, но, похоже, там не так много хорошей информации об этом.
Follow Up:
Этот вопрос был основан на плохие (но, вероятно, общие) предположения, потому что я всегда использовал with
для создания экземпляра нового объекта, в этом случае __init__/__del__
очень близко к тому же поведение, как __enter__/__exit__
(за исключением того, что вы не можете контролировать, когда или будет выполнено __del__
, это зависит от сбора мусора, и если процесс будет прерван первым, он никогда не может быть вызван). Но если вы используете ранее существовавшие объекты в операциях with
, они, конечно, совсем разные.
Когда (и даже если) '__del__' получает вызов, он недетерминирован. Вы можете потерять данные в зависимости от '__del__' для очистки. – user2357112
Возможный обман: http://stackoverflow.com/a/6772907/674039 – wim