Хорошо, вот несколько вещей, чтобы попытаться уточнить это:
1) определение класса
Определение класса - это не что иное, как шаблон для объектов, производных от него. В этом случае у класса что-то есть два «специальных» метода: init () и add ().
init (self ,. ..) методы вызывается, как только объект создан. В этом случае, когда создается объект класса что-то, его необходимо создать с аргументом, который будет внутренне добавлен к атрибуту noofpages этого объекта (self ссылается на объект, который будет создан)
add (self, other) метод скажет python, что делать, если добавляются два экземпляра этого типа класса, где self ссылается на объект, из которого вызывается сложение, а other ссылается на другой объект тот же класс.
Таким образом, после объявления шаблона для класса создаются два объекта класса что-то.
m=something(10)
n=something(20)
Эти два объекта являются различными экземплярами класса чего-то, и поэтому m будет иметь свои noofpages установив на 10 и n на 20, вы можете убедиться в этом, вызвав:
print(m.noofpages)
print(n.noofpages)
Теперь, когда мы установили, что хотя m и n являются двумя разными экземплярами одного и того же класса, мы можем перейти к add overload.
Сначала поговорим о соглашении об именах при перегрузке сложения (это делает функцию m больше смысла). Обычно вместо:
def __add__(self,b):
return str(self.noofpages + b.noofpages)+'hii'
Вы должны иметь:
def __add__(self,other):
return str(self.noofpages+other.noofpages)+'hii'
Так что self относится к экземпляру объекта, где вызывается метод, а other означает другой экземпляр того же типа. объекта.
Наконец, вызов m+n
аналогичен вызову m.__add__(n)
. Поэтому метод add вызывается для самого левого элемента добавления.
Надеюсь, я был более или менее понятен.