Я не могу понять, что происходит в следующем коде ... # Перегрузка метода - PullRequest
0 голосов
/ 17 февраля 2020
class something:

    def __init__(self, pages):
        self.noofpages=pages

    def __add__(self,b):
        return str(self.noofpages + b.noofpages)+'hii'

m=something(10)
n=something(20)
print(m+n)

Вывод: - 30hii

Как 10 собирается на self.noofpages и 20 на b.noofpages

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Хорошо, вот несколько вещей, чтобы попытаться уточнить это:

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 вызывается для самого левого элемента добавления.

Надеюсь, я был более или менее понятен.

1 голос
/ 17 февраля 2020

Да, это правильно

Ответ:

30hii

Маги c метод add делает именно это

Обратите внимание, что вы есть метод, который принимает ровно два аргумента

First Argument is self
Second Argument is b

Таким образом, вы фактически присваиваете эти значения здесь:

self.noofpages = m = 20
b.noofpages = n = 10

Теперь для возврата вы получите дополнительную строку

return str(self.noofpages + b.noofpages)+'hii' = m + n + "hii"
== 20 + 10 + "hii" == 30hii

Чтобы лучше понять метод волхвов c добавить , просто удалите его и запустите код, вы получите ошибку

...