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

Что такое self в python

  • автор:

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

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

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

Комментировать
Решения вопроса 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

Ответ написан более трёх лет назад
Нравится 62 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, . )

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

Для чего в python нужен self?

Ребят, кто может нормально объяснить для чего в языке python нужен self? Уже несколько статей перечитала и все никак не могу понять. Буду крайне благодарна.

Отслеживать
задан 22 мар 2020 в 17:26
Jarry a duck Jarry a duck
23 1 1 золотой знак 1 1 серебряный знак 6 6 бронзовых знаков
Ссылка на этот объект класса.
22 мар 2020 в 17:49

5 ответов 5

Сортировка: Сброс на вариант по умолчанию

Нормально объяснить может dark:

dark‎: у котов внутри есть мурчалка

dark‎: она реализована для всех котов в классе кот

‎dark‎: в объекте кот надо как то вызвать метод мурчало у класса кот

‎dark‎: как ты это сделаешь?

dark‎: кот.мурчало()

‎dark‎: ежели ты вызовешь кот.мурчало(), муркнут сразу все коты на свете

‎dark‎: а ежели ты вызовешь self.мурчало(), муркнет только тот кот, на которого указывает self

Отслеживать
ответ дан 23 мар 2020 в 19:15
26.3k 7 7 золотых знаков 32 32 серебряных знака 48 48 бронзовых знаков

Просто сам объект, от которого вызван метод.

Отслеживать
32.2k 15 15 золотых знаков 61 61 серебряный знак 93 93 бронзовых знака
ответ дан 22 мар 2020 в 17:32
593 1 1 золотой знак 4 4 серебряных знака 14 14 бронзовых знаков

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

Отслеживать
10.4k 21 21 золотой знак 25 25 серебряных знаков 53 53 бронзовых знака
ответ дан 22 мар 2020 в 17:49
69.9k 5 5 золотых знаков 20 20 серебряных знаков 51 51 бронзовый знак

class Dog: # 1. Создаём класс def __init__(self, name): self.name = name def __str__(self): return f'Имя моей собаки ' nick_name = Dog("Rex") # 2. Создаём экземпляр класса print(nick_name) # 3. Принтим, что мы задали для вывода в консоль # Имя моей собаки Rex # 3.1. Вот такой должен получиться вывод в консоли nick_name.name # 4. Запрашиваем значение атрибута "name", которое было передано при создании экземпляра класса "nick_name" # 'Rex' # 4.1. Получаем вывод 

Т.е. если приглядеться, то можно увидеть некую параллель между записью «self.name» (см. п. 1.) и записью «nick_name.name» (см. п. 4.).

Сам «self» – это своеобразная ссылка на будущий экземпляр класса «nick_name».

Отслеживать
77k 6 6 золотых знаков 57 57 серебряных знаков 123 123 бронзовых знака
ответ дан 23 мар 2020 в 12:14
107 1 1 золотой знак 1 1 серебряный знак 8 8 бронзовых знаков

Чтобы понять, ответьте на вопросы

L = len(globals()) class Foo: def __new__(cls, *args, **kwargs): print('__new__') # почему выведется перед __init__, и что лежит в cls ? return super(Foo, cls).__new__(cls) # почему это self ? def __init__(self, a): # почему в __init__ есть агрумент self, т.е. он существует до вызова ? self.a = a print('__init__') # почему выведется после __new__ ? def bar(ARG): # почему можно переименовать в ARG, а не self ? print(ARG.a) if __name__ == '__main__': print(len(globals()) - L, 'новых переменных') # почему тут 2 шт., если мы создали только переменную L ? _self_ = type('ob', (object,), dict(a='A')) Foo.bar(_self_) # 'A' - почему можно использовать не создавая объекта Foo ? self = Foo('B') # первое создание объекта - почему это self ? self.bar() # 'B' # обычное использование - почему в bar() один аргумент(self), а мы не передаем его ? self.bar.__call__() # 'B' - почему можно с __call__ ? _self_.a = 'C' self.bar.__func__(_self_) # 'C' - почему можно использовать так self.bar через _self_ ? 

Отслеживать
ответ дан 23 мар 2020 в 18:38
vadim vaduxa vadim vaduxa
8,887 14 14 серебряных знаков 24 24 бронзовых знака

    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.2.14.4854

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)

Что делает метод 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! 

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

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