Что такое self в python
Перейти к содержимому

Что такое self в python

  • автор:

Что делает метод self в python?

self в Python — это не метод, а специальный параметр, который передается первым аргументом в метод класса и представляет собой ссылку на экземпляр класса. Он используется для доступа к атрибутам и методам экземпляра из методов класса. Пример:

class Person: def greet(self, time): print(f'Good time>, self.name>!') bob = Person() bob.name = 'Bob' bob.greet('morning') # => Good morning, Bob! alice= Person() alice.name = 'Alice' alice.greet('evening') # => Good evening, Alice! 

self

self — это стандартное имя первого аргумента для методов объекта.

На заметку

Ничто не мешает изменить это имя и использовать любое другое, однако пренебрежение этим устоявшимся соглашением может ввести в заблуждение читателей вашего кода.

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

В ходе исполнения метода объекта в первом аргументе автоматически окажется экземпляр класса (передевать его специально не требуется).

 class MyClass:

def say(self):
print(self)


my_1 = MyClass() # Создаём объект класса.
my_1.say() #

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

 MyClass.say(my_1) #

Если передать в несвязанный [с объектом] метод класса объект, тип которого не совпадает с типом класса, в котором определён метод, поведение в Python 3 отличается от Python 2. Смотрите пример ниже.

 MyClass.say('нечто') 
# Python 3: нечто
# Python 2: TypeError: unbound method say() must be called with MyClass instance as first argument (got str instance instead)

Разбираемся с __init__ и self в Python

Одни из основных концепций, которые новички встречают при изучении Python и особенно объектно-ориентированного программирования (ООП), это __init__ и self.

Алексей Кодов
Автор статьи
7 июля 2023 в 17:27

Одни из основных концепций, которые новички встречают при изучении Python и особенно объектно-ориентированного программирования (ООП), это __init__ и self . Это ключевые элементы классов в Python, понимание которых является важным шагом в освоении языка.

Пример проблемы

Допустим, есть класс, который описывает сущность «Автомобиль».

class Car: def __init__(self, color, brand): self.color = color self.brand = brand

Здесь видим две незнакомые конструкции: __init__ и self . Что они делают?

Разбор init

__init__ — это специальная функция, которая вызывается при создании нового объекта класса. Она также известна как конструктор класса. Это место, где обычно устанавливаются начальные значения атрибутов класса.

В примере выше, __init__ принимает три аргумента: self , color и brand . color и brand — это значения, которые передаются при создании нового объекта класса Car , и они устанавливаются в качестве атрибутов объекта.

my_car = Car('blue', 'Toyota')

В этом случае ‘blue’ и ‘Toyota’ передаются в __init__ и устанавливаются в качестве атрибутов color и brand для my_car .

Разбор self

self — это ссылка на текущий экземпляр класса. Это способ обращения к атрибутам и методам класса изнутри самого класса.

В примере выше, self.color = color устанавливает атрибут color текущего объекта класса Car в значение color , переданное в __init__ .

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

my_car = Car('blue', 'Toyota') # self не передается

В заключение, __init__ и self являются важными концепциями в Python, особенно в контексте ООП. __init__ используется для инициализации новых объектов класса, а self — для ссылки на текущий объект класса.

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

Совсем непонятно, что такое self. Понятно, что его по умолчанию нужно писать как первый параметр описании каждого метода. То есть определение уже наизусть выучил, но трудно понять что оно значит. Вроде никаких затруднений пока что ни с чем больше нет, только с этим. Уже давно ищу, что это такое.

  • Вопрос задан более трёх лет назад
  • 125099 просмотров

1 комментарий

Простой 1 комментарий

Alex @XXX_Alex_Dev_XXX

Зачем нужен self в методах класса Python?

В Python self — это явный параметр, который обязательно нужно включать в методы класса. Он служит для связи метода с конкретным экземпляром класса.
Вот несколько причин, почему это необходимо:

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

Пример:
class MyClass:
def __init__(self, name):
self.name = name

def greet(self):
print(f»Привет, меня зовут !»)

person1 = MyClass(«Иван»)
person2 = MyClass(«Мария»)

person1.greet() # Выводит «Привет, меня зовут Иван!»
person2.greet() # Выводит «Привет, меня зовут Мария!»
В этом примере self.name используется для доступа к имени конкретного экземпляра класса (person1 или person2).

2. Изменение состояния экземпляра:
self также позволяет изменять состояние экземпляра класса.

Пример:
class MyClass:
def __init__(self, name):
self.name = name

def change_name(self, new_name):
self.name = new_name

person.greet() # Выводит «Привет, меня зовут Иван!»

person.greet() # Выводит «Привет, меня зовут Мария!»
В этом примере метод change_name изменяет имя экземпляра класса person.

3. Читаемость и понятность кода:
Использование self делает код более читаемым и понятным.

Пример:
# Плохой код
def greet(name):
print(f»Привет, меня зовут !»)

person1 = «Иван»
person2 = «Мария»

# Хороший код
class Person:
def __init__(self, name):
self.name = name

def greet(self):
print(f»Привет, меня зовут !»)

person1 = Person(«Иван»)
person2 = Person(«Мария»)

person1.greet()
person2.greet()
В этом примере использование self в методе greet делает код более понятным, так как сразу видно, что метод работает с экземпляром класса Person.

4. Связь с объектом:
self — это ссылка на объект, который вызвал метод.

Пример:
class MyClass:
def __init__(self, name):
self.name = name

def __repr__(self):
return f»»

print(person) # Выводит «»
В этом примере метод __repr__ использует self для возвращения информации о конкретном экземпляре класса.

5. Соответствие принципам ООП:
Использование self — это стандартный подход в объектно-ориентированном программировании (ООП).
Заключение:
Использование self в методах класса Python — это необходимость, которая обеспечивает:
— Доступ к атрибутам и методам экземпляра
— Изменение состояния экземпляра
— Читаемость и понятность кода
— Связь с объектом
— Соответствие принципам ООП

Решения вопроса 1

Defman21

Легко нагуглил.
stackoverflow.com/a/21366809/3307167 — по мне так самый понятный вариант.
stackoverflow.com/a/31096552/3307167 — а тут картиночки даже есть, для лучшего понимания.

Ответ написан более трёх лет назад
Нравится 10 9 комментариев
444 @444 Автор вопроса
Не совсем понял. Может перевел неправильно.
444 @444 Автор вопроса
То есть вместо self всегда представлять себе объект?

Defman21

class A: def test(self, a): self.a = a MyObject = A() MyObject.test(10) # A.test(MyObject, 10) -> MyObject.a = 10

Defman21

444: а вообще, лучше представлять self как self. Ссылка на себя внутри объекта.
444 @444 Автор вопроса
А все понятно.
444 @444 Автор вопроса

Defman21

444: пожалуйста 🙂
444 @444 Автор вопроса
Defman21: да я примерно так и думал всегда только очень сильно сомневался, я просто немного тупой.
444 @444 Автор вопроса
444: То есть не «немного».
Ответы на вопрос 8

Объяснение self в python:

dog‎: у котов внутри есть мурчалка
dog‎: она реализована для всех котов в классе кот
‎dog‎: в объекте кот надо как то вызвать метод мурчало у класса кот
‎dog‎: как ты это сделаешь?
dog‎: кот.мурчало()
‎dog‎: ежели ты вызовешь кот.мурчало(), муркнут сразу все коты на свете
‎dog‎: а ежели ты вызовешь self.мурчало(), муркнет только тот кот, на которого указывает self

Ответ написан более трёх лет назад
Нравится 63 5 комментариев

Viji

Я бы заменил кот на мурзик. типа того:
dog‎: у котов внутри есть мурчалка
dog‎: она реализована для всех котов в классе кот
‎dog‎: в объекте мурзик надо как то вызвать метод мурчало у класса кот
‎dog‎: как ты это сделаешь?
dog‎: кот.мурчало()
‎dog‎: ежели ты вызовешь кот.мурчало(), муркнут сразу все коты на свете
‎dog‎: а ежели ты вызовешь self.мурчало(), муркнет только тот кот, на которого указывает self — т.е. мурзик ))

ты гений:) Огромное спасибо.
объяснил настолько хорошо, что даже тот кто не программирует поймет как работает self. Спасибо)

smidtsam

Вадим, Вам бы Мурзилку издавать по ООП 🙂
а ежели вызовешь @staticmethod мурчало(), то муркнет кошачий дух представитель всех котов
Константин Довнар @SolidlSnake
Ваш дружелюбный сосед

Аналог слова this из других языков.
В Python «Явное лучше неявного» поэтому его необходимо задавать так конкретно.
Ссылается на конкретный экземпляр класса, а не на класс в целом.

Ответ написан более трёх лет назад
Нравится 7 1 комментарий
444 @444 Автор вопроса
Ну я про this знаю, потому и написал, что думал тоже самое только сомневался, но спасибо за ответ.

Survtur

self — это ни в коем случае не зарезервированное слово. Это просто название переменной.

В методах класса первый параметр функции по соглашению именуют self, и это ссылка на сам объект этого класса. Но это именно соглашение. Вы вольны называть параметры как угодно.

Зачем это нужно?

Ну вот есть объект и вы хотите создать/изменить поле у этого объекта из метода этого самого объекта.

class Human: def __init__(self): self.blood = 7000 def add_blood(self, volume): self.blood += volume

Ответ написан более трёх лет назад
Нравится 6 2 комментария
self помогает методу определить к какому объекту он относиться ?

Survtur

Да, self — это и есть этот объект.
Vovanchick @Vovanchick
И все равно ничего не понятно
Ответ написан более трёх лет назад
Нравится 4 2 комментария
что не понятно?!

class Human: def __init__(self): self.blood = 7000 def add_blood(self, volume): self.blood += volume

Здесь создается своя переменная blood в каждом объекте, который создан по шаблону класса Human.

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

class Human: def __init__(): blood = 7000 def add_blood(volume): blood += volume

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

Помогите не понимаю ничего

Я думаю, для понимания self нужно обратиться к static.

Я далее буду называть поля класса просто переменными класса.

В языке Object Pascal приписка self приписывается автоматически (неявно) к переменным класса. То есть её ставить не надо.

Можно рассматривать класс, как табличку с инструкцией для создания объектов и придания им свойств. Если перед переменой (полем) класса ничего не стоит, значит перед ней неявно присутствует self (в Object Pascal). Такая переменная НЕ меняется в классе (табличке с инструкцией), а присваивается конкретному объекту. То есть такая self переменная в классе (табличке с инструкцией) не изменяется. Чтобы переменная изменилась и в самом классе, нужно перед переменной поставить static. И она будет меняться уже и в самом классе (на той самой пресловутой табличке с инструкцией). Static используют, например, для подсчёта количества созданных объектов. Для этого к static переменной при создании объекта попросту добавляют 1 (единичку). Через конструктор, например. Каждый новый объект будет в результате своего создания добавлять к static переменной ещё одну единичку.

Но это в Object Pascal.

А в Python всё почти что наоборот. Все переменные (поля) класса изначально статичные static (неявно). А чтобы переменную сделать динамической (переменной объекта) то есть self, её просто нужно задать в каком-нибудь методе класса в аргументах. Метод _init_, мне кажется, подойдёт. И назвать, так чтобы она отражала свою сущность – ‘self’ или ‘my_object ‘ (отсылка, что переменная изменяется в объекте, а не в самом классе)

Ответ написан более года назад
Комментировать
Нравится 1 Комментировать

Автор вопроса, плиз ответь мне, таже самая проблема что и у тебя, не понимаю как этот self работает (((

Ответ написан более трёх лет назад
Simon_Says492 @Simon_Says492

На сколько я понимаю, self — это, своего рода, ссылка на объект. Объект — это экземпляр класса (пример ниже).

class KOT(): def __init__(self, name): self.name = name def muur(self): print(self.name, 'мурчит: мур мур') Matroskin = KOT('Матроскин') # это и есть объект (экземпляр класса) Matroskin.muur() # т.е если я сам, все правильно понял, то self становится Matroskin-ым

Грубо говоря, мы сделали Matroskin-а — главным героем нашего класса. Записали в его паспорт имя «Матроскин». И потом, он обратился к своему навыку muur, чтобы помурлыкать)

Ярослав @Yareeek192

self — это обращение именно к объекту,
class Human:
def __init__(self):
self.blood = 7000
self — выступает простым обращением к объекту.
x.blood = 7000 — можно присвоить конкретно этому объекту любое другое значение, например: x.blood = 6500.
соответсвенно и при вызове оно будет изменено
можно ничего не менять и если просто написать, то оно выдаст значение по умолчанию.
>>>x.blood
7000

Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
kosta_skull @kosta_skull

Была та же проблема. Я понял для себя так:

Как мы знаем, для вызова метода необходим такой синтаксис:

something.my_method(a, b, . )
где something — это объект класса MyClass.

Когда мы описываем(создаем) класс MyClass, в котором нам нужно прописать метод my_method, то мы пишем

class MyClass: def my_method(self, a, b, . ):

при этом self — это способ получить данные из той переменной, к которой этот метод применяют. В таких переменных лежат объекты с определенным атрибутами. В нашем примере, это объект, хранящийся в переменной something. То есть, первый параметр при описании нового метода — это место для указания переменной-объекта, к которому этот метод будут применять. Мы создали объект something, и self для этого объекта превратилась в something.

По этой причине мы можем вызвать тот же метод другим синтаксисом:

MyClass.my_method(something, a, b, . )

Результат будет такой же, как и при

Следующий слой понимания и ответа на вопрос: А зачем?

Допустим, у нашего объекта есть атрибут age, хранящий какое-то численное значение (например, 3). Это значение сделаем общим для всех создаваемых объектов этого класса. Мы хотим, чтобы написанный нами метод брал это значение и умножал на 2. Делаем мы это так

class MyClass: age = 3 def my_method(self): return self.age * 2

Теперь создадим объект something класса MyClass и посмотрим, чему равен атрибут age

something = MyClass() print(something.age) #Вывод: 3

Теперь посмотрим результат работы нашего метода

print(something.my_method()) #Вывод: 6

Теперь при вызове something.my_method() будет возвращено значение something.age*2, то есть 3*2=6

Мы во второй строке указали age = 3. Значение атрибута age будет в этом случае равнятся 3 для всех объектов этого класса, которые мы будем создавать. Но что, если мы хотим указывать age отдельно для каждого объекта?

Есть специальный метод __init__. Именно с таким именем. Напишете по-другому — не сработает. Он пишется в самом начале описания класса и его параметры задаются в скобках при создании объекта, то есть, вызов этого метода включен в процесс создание объекта класса автоматически. Сейчас на примере. Допустим, мы хотим, чтобы в нашем объекте было два атрибута: age, len. Атрибут age мы будем указывать при создании класса, а len будет считаться автоматически, и будет равен age*2.

class MyClass: def __init__(self, age): self.age = age self.len = age*2

теперь нам нужно будет при создании объекта something задать параметр age:

чему равны атрибуты age и len?

print(something.age) print(something.len) #Вывод: #6 #12

При создании объекта класса, синтаксис
something = MyClass(a, b, . )
работает аболютно так же, как
MyClass.__init__(something, a, b, . )

Сам новичок в ООП, так что могу что-то не так понять и вообще написать не сработающий код, так что жду комментов и предложений

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *