... self переменная представляет экземпляр самого объекта. Большинство объектно-ориентированных языков передают это как скрытый параметр методам, определенным в объекте; Python этого не делает. Вы должны объявить это явно. Когда вы создаете экземпляр A класса и вызываете его методы, он будет передан автоматически, как в ...
a = A() # We do not pass any argument to the __init__ method a.method_a('Sailor!') # We only pass a single argument
__init__ Метод - это примерно то, что представляет конструктор в Python. При вызове A() Python создает для вас объект и передает его в качестве первого параметра __init__ методу. Любые дополнительные параметры (например, A(24, 'Hello')) также будут переданы в качестве аргументов - в этом случае вызывая исключение, поскольку конструктор их не ожидает.
Ответ 2
Да, вы правы, это конструкции ооп.
__init__ это конструктор для класса. self Параметр ссылается на экземпляр объекта (как this в C ++).
classPoint: def__init__(self, x, y): self._x = x self._y = y
Метод __init__ вызывается после выделения памяти для объекта:
x = Point(1,2)
Важно использовать self параметр внутри метода объекта, если вы хотите сохранить значение в объекте. Если, например, вы реализуете __init__ метод следующим образом:
classPoint: def__init__(self, x, y): _x = x _y = y
Ваши параметры x и y будут храниться в переменных в стеке и будут удалены, когда метод init выйдет за пределы области видимости. Установка этих переменных как self._x и self._y устанавливает эти переменные как члены Point объекта (доступные в течение всего срока службы объекта).
Примечание: Некоторые пояснения по использованию слова "конструктор" в этом ответе. Технически обязанности "конструктора" в Python разделены на два метода. Этими методами являются __new__ (отвечает за выделение памяти) и __init__ (как обсуждалось здесь, отвечает за инициализацию вновь созданного экземпляра).
Ответ 3
Краткий иллюстративный пример
В надежде, что это может немного помочь, вот простой пример, который я использовал, чтобы понять разницу между переменной, объявленной внутри класса, и переменной, объявленной внутри __init__ функции:
classMyClass(object): i = 123 def__init__(self): self.i = 345
a = MyClass() print(a.i) print(MyClass.i)
Вывод:
345 123
Ответ 4
Вкратце:
self как следует из этого, относится к самому себе - объекту, который вызвал метод. То есть, если у вас есть N объектов, вызывающих метод, то self.a будет ссылаться на отдельный экземпляр переменной для каждого из N объектов. Представьте себе N копий переменной a для каждого объекта
__init__ это то, что вызывается как конструктор в других языках ООП, таких как C ++ / Java. Основная идея заключается в том, что это специальный метод, который автоматически вызывается при создании объекта этого класса