На самом деле, объект уже был создан при вызове __init__
. Вот почему вам нужно self в качестве параметра. И из-за того, как Python работает внутренне, у вас нет доступа к объектам без self (Имейте в виду, что его не нужно называть self, вы можете называть его как угодно, если только оно является допустимым именем . Экземпляр всегда является первым параметром метода, каким бы ни было его имя.).
Правда в том, что __init__
не создает объект, он просто инициализирует его. Существует метод класса с именем __new__
, который отвечает за создание экземпляра и его возврат. Вот где создается объект.
Теперь, когда объект получает атрибут a
. Это в __init__
, но у вас есть доступ к его методам внутри __init__
. Я не совсем осведомлен о том, как работает создание объектов, но методы уже установлены, как только вы дойдете до этой точки. Это не происходит со значениями, поэтому они недоступны, пока вы сами не определите их в __init__
.
В основном Python создает объект, предоставляет ему его методы, а затем дает вам экземпляр, чтобы вы могли инициализировать его атрибуты.
EDIT
Еще одна вещь, которую я забыл упомянуть. Так же, как вы определяете __init__
, вы можете определить __new__
самостоятельно. Это не очень часто, но вы делаете это, когда вам нужно изменить фактическое создание объекта. Я видел это только при определении метаклассов ( Что такое метаклассы в Python? ). Другой метод, который вы можете определить в этом случае - __call__
, что дает вам еще больший контроль.