Существует разница между конструктором в C ++ и методом __init__
в Python. В C ++ задача конструктора - создать объект. Если это не удается,
деструктор не называется. Поэтому, если какие-либо ресурсы были приобретены до
было сгенерировано исключение, очистка должна быть выполнена перед выходом из конструктора.
Таким образом, некоторые предпочитают двухфазное строительство, большая часть которого выполнена
снаружи конструктор (тьфу).
Python имеет намного более чистую двухфазную конструкцию (
инициализация). Однако многие люди путают метод __init__
(инициализатор)
с конструктором. Фактический конструктор в Python называется __new__
.
В отличие от C ++, он не берет экземпляр, но
возвращает один. Задача __init__
- инициализировать созданный экземпляр.
Если исключение возникает в __init__
, деструктор __del__
(если есть)
будет вызван, как и ожидалось, поскольку объект уже был создан (даже если он не был должным образом инициализирован) к моменту вызова __init__
.
Отвечая на ваш вопрос:
В Python, если код в вашем
«конструктор» не работает, объект заканчивается
не определено.
Это не совсем так. Если __init__
вызывает исключение, объект
созданы, но не инициализированы должным образом (например, некоторые атрибуты не
назначен). Но в то время, когда он поднимается, у вас, вероятно, нет никаких ссылок на
этот объект, поэтому тот факт, что атрибуты не назначены, не имеет значения. Только деструктор (если есть) должен проверить, действительно ли существуют эти атрибуты.
Как правильно это сделать?
В Python инициализируйте объекты в __init__
и не беспокойтесь об исключениях.
В C ++ используйте RAII .
Обновление [об управлении ресурсами]:
В языках с сборкой мусора, если вы имеете дело с ресурсами, особенно ограниченными, такими как соединения с базой данных, лучше не освобождать их в деструкторе.
Это потому, что объекты уничтожаются недетерминированным способом, и если вы случитесь
иметь цикл ссылок (что не всегда легко узнать), и хотя бы для одного из объектов в цикле определен деструктор, они никогда не будут уничтожены.
У языков, собираемых мусором, есть и другие способы обращения с ресурсами. В Python это с оператором .