Я искал, и я не могу придумать какой-либо веской причины для использования __enter__
/__exit__
python вместо __init__
(или __new__
?) / __del__
.
Я понимаю, что __enter__
/__exit__
предназначены для использования с оператором with
в качестве менеджеров контекста, и оператор with
великолепен. Но противоположностью этому является то, что любой код в этих блоках только выполняется в этом контексте. Используя их вместо __init__
/__del__
, я, кажется, создаю неявный контракт с вызывающими абонентами, что они должны использовать with
, но нет никакого способа обеспечить соблюдение такого контракта, и контракт передается только через документацию (или чтение кода). Это кажется плохой идеей.
Кажется, я получаю тот же эффект, используя __init__
/__del__
внутри блока with
. Но, используя их, а не методы управления контекстом, мой объект полезен и в других сценариях.
Итак, может ли кто-нибудь придумать вескую причину, почему я когда-либо хочу использовать методы управления контекстом, а не методы конструктора/деструктора?
Если есть лучшее место, чтобы задать подобный вопрос, пожалуйста, дайте мне знать, но, похоже, там не так много хорошей информации об этом.
Последующие действия:
Этот вопрос был основан на неверном (но, вероятно, распространенном) предположении, поскольку я всегда использовал with
для создания экземпляра нового объекта, и в этом случае __init__/__del__
очень близко к тому же поведению, что и __enter__/__exit__
(за исключением того, что вы не можете контролировать, когда или если __del__
будет выполняться, это зависит от сборки мусора, и если процесс завершится первым, он никогда не будет вызван). Но если вы используете уже существующие объекты в операторах with
, они, конечно, сильно отличаются.
__del__
, это недетерминировано. Вы можете потерять данные, полагаясь на__del__
для очистки. - person user2357112 supports Monica   schedule 10.11.2016