Self python зачем нужен

Что такое Self в Python — подробно на примерах

Если вы давно изучаете программирование на Python, то встречали слово «self». Оно встречается всякий раз, когда вы работаете над объектно-ориентированным программированием на Python. Вы видели его в определениях методов и инициализации переменных. Но прежде, чем говорить о том, что означает и как использовать параметр self в Python, давайте разберемся, что такое переменные класса и экземпляра и что такое методы класса и экземпляра.

Переменные класса в Python

Переменные класса — это тип переменных, совместно используемых всеми экземплярами этого класса. Если вы обращаетесь к переменным класса из экземпляров, то значение будет таким же. Переменные класса определяются сразу после определения класса и вне каких-либо методов или функций.

В этом коде var_1, var_2 и var_3 являются переменными класса.

Переменные экземпляра в Python

Переменные экземпляра — это переменные, в которых все экземпляры хранятся сами по себе (т. е. конкретный объект владеет своими переменными экземпляра). Таким образом, значения переменных отличаются от экземпляра к экземпляру.

В этом коде переменными экземпляра являются instace_var1 и instance_var2.

В отличие от переменных класса, переменные экземпляра должны быть определены внутри методов.

В этом примере мы определили три переменные класса и три переменные экземпляра.

Затем мы создали два экземпляра с именами obj1 и obj2. Теперь, если вы обращаетесь к переменным класса с помощью obj1 и obj2, значения будут одинаковыми. Итак, в нашем примере у нас есть доступ к var_1 и var_2 с разными экземплярами, и значения такие же, как вы видите в выводе.

Читайте также:  Triggering events in javascript

Но когда мы обращаемся к переменным экземпляра с разными экземплярами, значения различны. Это связано с тем, что мы предоставляем значения через метод __init__(), и поэтому значения различаются от экземпляра к экземпляру.

Методы класса в Python

Методы класса полезны для установки или получения сведений(статуса) о классе. Метод класса имеет определенный параметр, который следует поместить в качестве первого параметра. Это параметр cls, представляющий класс.

В этом примере мы определили метод класса с помощью декоратора @classmethod. Метод класса здесь class_method, который принимает cls в качестве параметра. Это то же самое, что и self при создании метода экземпляра.

Итак, когда мы определяем метод класса, мы передаем cls в качестве первого параметра, а когда мы определяем метод экземпляра, мы передаем self в качестве первого параметра.

Затем мы получили доступ к методу класса, используя только класс, а не объект. Мы также получили доступ к переменным класса, используя class.

Итак, даже не создавая экземпляр объекта, мы можем получить доступ к методам класса следующим образом:

Методы экземпляра

Мы видели переменные экземпляра, переменные класса и методы класса. Теперь мы увидим методы экземпляра.

При определении метода экземпляра первым параметром метода всегда должно быть self. Тем не менее, вы можете назвать это как угодно и не обязательно self, но то, что представляет этот аргумент, всегда будет одним и тем же. И это лучшая идея для того, чтобы придерживаться self, поскольку это глобальная конвенция.

В этом примере мы определили метод экземпляра с именем add(), который принимает два параметра. Затем мы создали экземпляр объекта и вызвали метод add().

Итак, как вы можете заметить из приведенного выше кода, при определении метода экземпляра первым параметром является self; когда мы вызываем этот метод, мы ничего не передаем для self в качестве аргументов.

Что такое self в Python?

Ключевое слово self представляет экземпляр(объект) данного класса. Например, в приведенном выше случае объект obj имеет собственные атрибуты a и b. Если бы не было собственного аргумента, то один и тот же класс не мог бы содержать информацию для обоих этих объектов.

Однако, поскольку класс является планом, self позволяет получить доступ к атрибутам и методам каждого объекта в Python. Это позволяет каждому объекту иметь свои атрибуты и методы. Даже задолго до создания этих объектов мы ссылаемся на объекты как на себя при определении класса.

Явное определение self

Даже когда мы знаем, как использовать self, это может показаться странным, особенно программистам из других языков программирования. Self передается в качестве аргумента явно каждый раз, когда мы определяем метод экземпляра.

Если вы запустите приведенный выше код, вы получите следующий вывод:

В приведенном выше примере __init__() определяет три параметра, но мы только что передали два(3 и 7). Точно так же для функции multi() требуется один аргумент, но при вызове функции obj.multi() не было передано ни одного аргумента. Так почему же это не дает ошибок?

Как использовать?

Когда мы вызываем метод экземпляра с некоторыми параметрами, корреляционная функция класса вызывается путем помещения объекта метода перед первым параметром. Итак, что-нибудь вроде obj.multi(args) становится Class.multi(obj, args). Вызывающий процесс является автоматическим, а принимающий процесс — нет(явный).

Это основная причина, по которой первым аргументом функции в классе должен быть сам объект. Запись этого параметра как self является чисто соглашением. Это не ключевое слово и не имеет особого значения в Python.

Мы могли бы использовать другие имена, но это крайне не рекомендуется. Использование имен, отличных от self, не одобряется большинством разработчиков и ухудшает читабельность кода.

Понятно, что сам объект(экземпляр) автоматически передается в качестве первого аргумента. Неявного поведения можно избежать при создании статического метода. Мы видели метод класса ранее в этом посте.

Явный self не уникален для Python. Эта идея была позаимствована у Modula-3.

Python __init__()

Метод Python __init__() не является конструктором. Многие программисты путаются с этим, поскольку __init__() вызывается, когда мы создаем объект.

Если вы внимательно посмотрите, то увидите, что первый параметр в __init__() — это сам объект(объект уже существует). Функция __init__() вызывается сразу после создания объекта и используется для его инициализации.

С технической точки зрения конструктор — это метод, создающий сам объект. В Python этот метод называется __new__(). Типичная сигнатура этого метода следующая.

Источник

Что означает self в Python?

Язык программирования Python

В Python self является причиной многих проблем для разработчиков, которые занимаются объектно-ориентированным программированием, давайте попробуем разобраться в этом вопросе!

Когда я начал всерьез интересоваться Python и объектно-ориентированным программированием, я никак не мог понять одну вещь: self.

Сначала я просто добавлял его внутри своих методов и перед каждым атрибутом, не понимая, что происходит на заднем плане, потому что в целом программа работала нормально.

Очень важно, чтобы вы понимали, что означает это “self” и почему оно полезно при разработке на Python.

Это ключевое понятие в объектно-ориентированном программировании, которое вам необходимо понять!

Создадим класс

Допустим, вы фанат велоспорта и хотите создать программу для борьбы с вашей всепоглощающей зависимостью от облегающих спортивных шорт:

class Velo: wheels = 2 def __init__(self, brand, price, weight): self.brand = brand self.price = price self.weight = weight velo = Velo(self="Peugeot", price=500, weight=100)

Для начала я напомню вам разницу между переменной экземпляра и переменной класса, чтобы вам было понятнее:

Переменные класса – это переменные, которые являются общими для всех экземпляров вашего класса.

В нашем классе Velo переменная wheels является переменной класса.

Это вполне логично, потому что почти все велосипеды работают на двух колесах и не более, если только вы не живете в Юго-Восточной Азии и не ездите регулярно на тук-туке.

Мы определяем их внутри класса, но вне всех остальных методов!

Примечание. Внутри класса мы говорим уже не о функциях, а о методах.

С другой стороны, у нас есть переменные экземпляра, значения которых отличаются от экземпляра к экземпляру.

В нашем примере переменные self.brand, self.price и self.weight являются переменными экземпляра.

Как вы можете видеть, они определяются внутри метода init.

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

Поэтому вы должны вложить все, что свойственно объекту, который вы хотите создать.

Давайте посмотрим, что произойдет, если я создам два экземпляра класса Velo и попытаюсь получить доступ к этим переменным:

class Velo: wheels = 2 def __init__(self, brand, price, weight): self.brand = brand self.price = price self.weight = weight velo_01 = Velo("btwin", 250, 15) velo_02 = Velo("rockrider", 170, 12) print(velo_01.wheels) # 2 print(velo_02.wheels) # 2 print(velo_01.brand) # btwin print(velo_02.brand) # rockrider'

Как я уже сказал, все экземпляры имеют доступ к переменным класса, вот почему два моих велосипеда имеют по два колеса, и мне не нужно ничего указывать.

Однако вы можете видеть, что каждый велосипед имеет свой собственный бренд, потому что это два разных экземпляра!

В чем цель self?

Когда я создавал свой метод init, вы заметили, что в дополнение к параметрам я добавил слово self.

Я также использовал его для определения переменных экземпляра.

Self используется для представления экземпляра класса! Благодаря ему я могу получить доступ к атрибутам и методам своего класса.

Давайте создадим метод экземпляра, чтобы вы могли увидеть это на практике:

class Velo: wheels = 2 def __init__(self, brand, price, weight): self.brand = brand self.price = price self.weight = weight def drive(self): print("Лучший велосипед: <> !".format(self.brand)) velo_01 = Velo("btwin", 250, 15) velo_02 = Velo("rockrider", 170, 12) print(velo_01.wheels) # 2 print(velo_02.wheels) # 2 print(velo_01.brand) # btwin print(velo_02.brand) # rockrider velo_01.drive() # Лучший велосипед: btwin ! velo_02.drive() # Лучший велосипед: rockrider !

Я создал метод drive в классе Velo и указал self в качестве первого параметра:

def drive(self): print("Лучший велосипед: <> !".format(self.brand))
Code language: PHP (php)

Поэтому я могу вызвать этот метод drive на всех созданных мною экземплярах.

Примечание. Обратите внимание, что вам не нужно явно использовать слово self, поскольку оно не является зарезервированным словом в Python. Если вы пришли из другого языка программирования, например, JavaScript, вам, возможно, привычнее это использовать. Поэтому вы можете использовать Maria вместо self, и это будет работать точно так же.

В Python мы традиционно используем слово self, но вы можете поступать так, как хотите (мы не советуем, даже если нам нравится Мария )!

С другой стороны, есть правило, которое вы должны соблюдать абсолютно точно:

Когда вы определяете метод экземпляра, ваш экземпляр, то есть self (или слово, которое вы выбрали для обозначения вашего экземпляра), всегда должен передаваться в первой позиции, это обязательно, поэтому обратите на это внимание.

Секрет self

Возможно, вы заметили, но в последнем примере я вызвал метод drive без передачи каких-либо аргументов, и все же код сработал. Мне удалось вывести сообщение с брендом велосипеда текущего экземпляра.

Вы можете задаться вопросом, как мой метод drive знает, что нужно использовать атрибуты именно этого экземпляра, а не другого?

Я думаю, вы поняли, это все self!

velo_01.drive()
Code language: CSS (css)

Вот что происходит за кулисами:

Velo.drive(velo_01)
Code language: CSS (css)

Интерпретатор Python автоматически выполняет “преобразование” за вас!

С одной стороны, это делает ваш код более эстетичным, а с другой – облегчает жизнь, когда вы хотите наследовать свой класс от других классов.

И, очевидно, если вы забудете добавить self при определении метода экземпляра, у вас возникнут небольшие проблемы, когда вы захотите его использовать:

def drive(): print("Лучший велосипед: <> !".format(self.brand)) velo_01.drive() #TypeError: drive() takes 0 positional arguments but 1 was given
Code language: CSS (css)

Эта ошибка часто непонятна людям, не привыкшим к объектно-ориентированному программированию.

Python сообщает нам, что методу drive был передан аргумент (1 was given), однако, если посмотреть на наш код, мы не передаем никакого аргумента.

velo_01.drive()
Code language: CSS (css)

Как мы только что видели выше, в фоновом режиме Python использует ваш класс для выполнения метода drive и автоматически передает экземпляр в качестве первого аргумента.

Итак, аргумент передается методу drive, просто вы этого не видите, и это делаете не вы, Python сам об этом позаботится.

# Используем метод drive для экземпляра velo_01.drive() # Это то же самое, что пройти через класс и передать экземпляр Velo.drive(velo_01)
Code language: CSS (css)

Поэтому вы должны указать self в качестве первого параметра в определении метода drive, чтобы использовать его с экземпляром velo_01.

Источник

Оцените статью