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

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

Предлагаю следующий пример:
class Student :
    def f (self, n, y) :
        self.name=n
        self.year=y
        print(self.name, "is on the", self.year, "-th year")
        
s=Student()
s.f ("Vasya", 5)

На сколько я понял, self - это указатель на экземпляр класса, и запись s.f ("Vasya", 5) равнозначна записи Student.f(s,"Vasya", 5)
Т.е. выполняяs.f("Vasya", 5)мы не вызываем напрямую метод из экземпляра, а ссылаемся на метод и класса-родителя.

Но мне остается непонятным:

1. В чем будет отличие, если мы вместо
class Student :
    def f (self, n, y) :
        self.name=n
        self.year=y
        print(self.name, "is on the", self.year, "-th year")
напишем
class Student :
    def f (self, n, y) :
        name=n
        year=y
        print(name, "is on the", year, "-th year")

2. Почему если мы уберем self из описания класса
class Student :
    def f (n,y) :
        name = n
        year = y
        print(name, "is on the", year, "-th year")
то при вызове s.f("Vasya", 5) получим ошибку
TypeError: f() takes 2 positional arguments but 3 were given
Какой третий параметр был передан?
3. Когда стоит добавлять self в описание метода класса, а когда нет?

Заранее спасибо за Ваши ответы!
  • Вопрос задан
  • 17280 просмотров
Решения вопроса 1
Tiendil
@Tiendil
Разработчик ПО.
Видимо из вселенной C++ Вы к нам заглянули. Гуглите на тему bound/unbound methods

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

self.x = 1 — присваивает значение 1 аттрибуту объекта.
x = 1 — присваивает значение 1 локальной переменной (даже если присваивание происходит в методе класса).

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

3. Когда объявляете метод, который будет вызываться для экземпляра класса.

Очень рекомендую почитать эти доки, прежде чем дальше разбираться с языком:

- https://docs.python.org/2/reference/datamodel.html
- https://docs.python.org/2/tutorial/classes.html
- https://docs.python.org/2/reference/executionmodel.html
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы