Роль self в классе

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


Ответы (4 шт):

Автор решения: Igor

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

→ Ссылка
Автор решения: AndroID

self - это обращение к самому экземпляру класса. То есть, если вы хотите объявить переменную x в классе, нужно использовать self.x = ... . (также, переменная в классе называется свойством). Если не использовать self, то x будет локальной и потом вы не сможете к ней обратиться.

Кортеж (tuple) - то же, что список (list), но его нельзя изменять после объявления (у него просто нет таких методов).

→ Ссылка
Автор решения: vp_arth

На примере понять проще всего:

class Counter:
  def __init__(self, start):
    self.x = start
    self.self = self # сохраним self в свойстве объекта, чтобы происпектировать его позже
  def increment(that): # Это просто аргумент функции, просто принято использовать self
    that.x += 1

a = Counter(2) # вызываем __init__ чтобы создать объект, передаём start=2
print(a.x) # 2 
a.increment()
a.increment()
print(a.x) # 4
print(a, a.self) # <__main__.Counter object at 0x7f83f92e86a0> <__main__.Counter object at 0x7f83f92e86a0>
print(a.self is a) # True Т.е. self - это имя привязанное к самому объекту
print(a.self.self.self.x) # 4
→ Ссылка
Автор решения: Джефф

Список - изменяемый (мутируемый) тип данных:

list = [1, 2, 3]
list[0] = 4  # можно изменить любой элемент списка
print(list)  # [4, 2, 3]

Кортеж - не изменяемый (не мутируемый) тип данных:

tuple = (1, 2, 3)
tuple[0] = 4  # TypeError: 'tuple' object does not support item assignment

Преимущество кортежа - скорость работы в сравнении со списком.

→ Ссылка