Как метод может вызвать класс, членом которого он является в python? - PullRequest
0 голосов
/ 16 октября 2018

Я изучаю Python, и я нашел код для дроби ниже.Класс Fraction имеет метод __add__, возвращение которого вызывает класс Fraction.(return Fraction(new_num // common, new_den // common)).

Я не совсем понимаю, как метод может вызывать класс, частью которого он является.Я имею в виду, что интерпретатор даже не полностью завершил чтение класса Fraction (после метода __add__ есть метод __eq__), когда метод __add__ вызывает класс Fraction.Что, если метод __add__ хотел бы использовать метод classes __eq__, когда метод __eq__ находится ниже него?

class Fraction:
    def __init__(self, top, bottom):
        self.num = top
        self.den = bottom
    def __str__(self):
        return str(self.num) + "/" + str(self.den)
    def show(self):
        print(self.num, "/", self.den)
    def __add__(self, other_fraction):
        new_num = self.num * other_fraction.den + \
            self.den * other_fraction.num
        new_den = self.den * other_fraction.den
        common = gcd(new_num, new_den)
        return Fraction(new_num // common, new_den // common)
    def __eq__(self, other):
        first_num = self.num * other.den
        second_num = other.num * self.den
        return first_num == second_num

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я имею в виду, что интерпретатор даже не полностью завершил чтение класса Fraction

Он уже был проанализирован и выполнен при первом запуске __add__.Тела функций и методов не выполняются во время импорта, но тела классов (даже вложенные тела классов).

Демонстрационный скрипт:

class Upper:
    print('Upper')
    class Mid:
        print('Mid')
    def method(self):
        class Low:
            print('Low')
        print('method')

Вывод:

$ python3
>>> import demo
Upper
Mid

По этой причине нельзя ссылаться на класс метода в этом методе (поскольку метод не вызывается при создании класса).

С другой стороны, вы не можете получить доступ кимя класса, пока он еще создается внутри частей, которые выполняются во время импорта.

>>> class A:
...     print(A)
...
[...]
NameError: name 'A' is not defined
0 голосов
/ 16 октября 2018
return Fraction(new_num // common, new_den // common)

То, что вы называете "вызовом класса Fraction", фактически создает новый экземпляр Fraction с указанным числителем и знаменателем.Если вы знакомы с Java, это эквивалентно return new Fraction(...).В Python мы не используем ключевое слово new.

Я имею в виду, что интерпретатор даже не полностью завершил чтение класса Fraction

Когда эта строкаразобрав, интерпретатор знает, что класс Fraction существует, чего на тот момент достаточно.К тому времени, когда строка выполняется с вызовом функции __add__() в экземпляре Fraction, интерпретатору доступен весь класс Fraction.

Что если __add__метод хотел использовать метод классов __eq__, когда метод __eq__ находится под ним?

Это прекрасно, потому что к тому времени, когда тело метода выполняется, __eq__метод был распознан и доступен для вызова.

...