Вопрос-Ответ

What do __init__ and self do in Python? [duplicate]

Что делают __init__ и self в Python?

Я изучаю язык программирования Python и столкнулся с чем-то, чего не до конца понимаю.

В таком методе, как:

def method(self, blah):
def __init__(?):
....
....

Что self делает? Что это должно быть? Обязательно ли это?

Что делает метод __init__? Зачем это нужно? (и т.д.)

Я думаю, что это могут быть конструкции ООП, но я не очень много знаю.

Переведено автоматически
Ответ 1

В этом коде:

class A(object):
def __init__(self):
self.x = 'Hello'

def method_a(self, foo):
print self.x + ' ' + foo

... 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 ++).

class Point:
def __init__(self, x, y):
self._x = x
self._y = y

Метод __init__ вызывается после выделения памяти для объекта:

x = Point(1,2)

Важно использовать self параметр внутри метода объекта, если вы хотите сохранить значение в объекте. Если, например, вы реализуете __init__ метод следующим образом:

class Point:
def __init__(self, x, y):
_x = x
_y = y

Ваши параметры x и y будут храниться в переменных в стеке и будут удалены, когда метод init выйдет за пределы области видимости. Установка этих переменных как self._x и self._y устанавливает эти переменные как члены Point объекта (доступные в течение всего срока службы объекта).

Примечание: Некоторые пояснения по использованию слова "конструктор" в этом ответе. Технически обязанности "конструктора" в Python разделены на два метода. Этими методами являются __new__ (отвечает за выделение памяти) и __init__ (как обсуждалось здесь, отвечает за инициализацию вновь созданного экземпляра).

Ответ 3

Краткий иллюстративный пример

В надежде, что это может немного помочь, вот простой пример, который я использовал, чтобы понять разницу между переменной, объявленной внутри класса, и переменной, объявленной внутри __init__ функции:

class MyClass(object):
i = 123
def __init__(self):
self.i = 345

a = MyClass()
print(a.i)
print(MyClass.i)

Вывод:

345
123
Ответ 4

Вкратце:


  1. self как следует из этого, относится к самому себе - объекту, который вызвал метод. То есть, если у вас есть N объектов, вызывающих метод, то self.a будет ссылаться на отдельный экземпляр переменной для каждого из N объектов. Представьте себе N копий переменной a для каждого объекта

  2. __init__ это то, что вызывается как конструктор в других языках ООП, таких как C ++ / Java. Основная идея заключается в том, что это специальный метод, который автоматически вызывается при создании объекта этого класса

python