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

Что такое self в python

  • автор:

Для чего в 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
25.9k 7 7 золотых знаков 31 31 серебряный знак 48 48 бронзовых знаков

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

Отслеживать
32.2k 15 15 золотых знаков 60 60 серебряных знаков 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
67.7k 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».

Отслеживать
76.7k 6 6 золотых знаков 54 54 серебряных знака 120 120 бронзовых знаков
ответ дан 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_ ? 

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! 

Класс 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 не будет опубликован. Обязательные поля помечены *