Была та же проблема. Я понял для себя так:
Как мы знаем, для вызова метода необходим такой синтаксис:
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, ...)
Сам новичок в ООП, так что могу что-то не так понять и вообще написать не сработающий код, так что жду комментов и предложений