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

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

    Результат будет такой же, как и при

    something.my_method(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:

    something = MyClass(6)

    чему равны атрибуты age и len?
    print(something.age)
    print(something.len)
    
    #Вывод:
    #6
    #12


    При создании объекта класса, синтаксис
    something = MyClass(a, b, ...)
    работает аболютно так же, как
    MyClass.__init__(something, a, b, ...)

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