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

Что такое self в питоне

  • автор:

Что делает метод 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 в Python: обращение к атрибутам класса

Ключевое слово self в Python: обращение к атрибутам класса

19 марта 2023
Оценки статьи
Еще никто не оценил статью

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

Ключевое слово self

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

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

Пример использования self:

class Car:  def __init__(self, brand, model):  self.brand = brand self.model = model def display_info(self):  print(f"Brand: self.brand>, Model: self.model>")  car = Car("Toyota", "Corolla") car.display_info() 

В данном примере, мы создаем класс Car , и определяем метод display_info , который выводит на экран марку и модель автомобиля. В методе display_info , мы используем self.brand и self.model для обращения к атрибутам объекта класса Car .

Использование self в методах класса

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

class Rectangle:  def __init__(self, width, height):  self.width = width self.height = height def area(self):  return self.width * self.height def perimeter(self):  return 2 * (self.width + self.height)  def display_info(self):  print(f"Width: self.width>, Height: self.height>, Area: self.area()>, Perimeter: self.perimeter()>")  rect = Rectangle(5, 10) rect.display_info() 

В данном примере, мы создаем класс Rectangle , и определяем методы area и perimeter , которые вычисляют площадь и периметр прямоугольника. Мы также определяем метод display_info , который выводит на экран ширину, высоту, площадь и периметр прямоугольника, используя ключевое слово self .

Заключение по ключевому слову self

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

Ниже приведены основные выводы, которые можно сделать о работе с self в Python:

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

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

Меню категорий

    Загрузка категорий.

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

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

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

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

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

Класс self в Python

В этом уроке мы изучим использование self в Python. Это часто становится предметом споров среди экспертов и проблемой для новичков.

Python – это не язык, который создавался для парадигмы объектно-ориентированного программирования. Таким образом, создание статического метода в Python не является прямым. Посмотрим, как это делается:

class Person: def static_method(): print("This is a static method")

Теперь, чтобы создать метод, который может работать с реальным объектом «Person», нам нужно предоставить ему ссылку на этот объект. Итак, вместо передачи полного объекта Person в его собственный класс мы можем использовать self как:

class Person: def object_method(self): print("I can do something with self.")

Класс self в python

Затем давайте посмотрим, как его можно использовать для доступа к полям в самом конструкторе класса.

Самостоятельный конструктор

self также может использоваться для ссылки на поле переменной в классе:

class Person: # name made in constructor def __init__(self, n): self.name = n def get_person_name(self): return self.name

В приведенном выше фрагменте self относится к переменной имени всего класса Person. Обратите внимание: если у нас есть переменная в методе, self не будет работать. Эта переменная просто существует только во время выполнения этого метода и, следовательно, является локальной для этого метода. Для определения глобальных полей (переменных полного класса) нам нужно определить их ВНЕ методов класса. Обратитесь к области переменной python.

Пример использования self

self – ключевое слово?

self используется во многих местах в Python, поэтому люди думают, что это ключевое слово. Но в отличие от C ++ self не является ключевым словом.

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

Это означает, что последний класс можно сделать как:

class Person: #name made in constructor def __init__(another, n): another.name = n; def get_person_name(another): return another.name

Должны ли мы передать self методу?

Приведенное выше объяснение открывает новый вопрос, должны ли мы просто передать self методу? Давайте рассмотрим класс Person, который содержит метод, определенный как:

def something(another, arg1, arg2): pass

Если personMe является экземпляром класса и вызывается personMe.something (arg1, arg2), python внутренне преобразует его для нас как:

Person.something(personMe, arg1, arg2)

Переменная self относится к самому объекту.

Это все для self и его использования в конструкторе и функциях для получения текущей ссылки на объект.

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

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