Что происходит за кулисами при вызове object.method () и Class.method (object)? - PullRequest
0 голосов
/ 14 февраля 2019

Я довольно новичок в Python и занимаюсь ООП.Я немного сбит с толку относительно того, когда использовать вызовы методов и классов.В приведенном ниже примере кода выводится среднее значение, однако мне любопытно, когда вы будете использовать вызовы методов класса против методов с точки зрения реального мира.Я почти уверен, что это то, с чем мне, возможно, еще предстоит справиться, но это было немного путаницей относительно того, когда я буду использовать один поверх другого.

class Student:
    def __init__(self, new_name, new_grades):
        self.name = new_name
        self.grades = new_grades

    def average(self):
        return sum(self.grades) / len(self.grades)

student_one = Student('Test User', [70, 88, 90, 99])

# object.method()
print(student_one.average())

# Class.method(object)
print(Student.average(student_one))

1 Ответ

0 голосов
/ 14 февраля 2019

В вашем примере разницы нет. Используйте первый способ. Второй способ заставляет вас выглядеть так, как будто вам нужно по какой-то причине использовать «заднюю дверь», например, если type(student_one) is not Student, но вы хотели специально вызвать метод averageStudent class.

Для того, что происходит за кулисами, первый способ использует связанный метод , а второй способ просто использует обычный function .

>>> Student.average
<function __main__.Student.average(self)>
>>> student_one.average 
<bound method Student.average of <__main__.Student object at 0xcafef00d>>

Связанный метод - это просто функция, которая привязана к экземпляру через протокол дескриптора *, и экземпляр ("self") передается какпервый позиционный аргумент неявно:

>>> student_one.average.__self__ is student_one 
True
>>> student_one.average.__func__ is Student.average 
True

Используя функцию класса и явно передавая экземпляр, вы, по сути, делаете то же самое, что и вызов дескриптора автоматически.

Для более глубокого понимания того, что такое метод, есть подробная документация этого процесса связывания в документах здесь .

* Просто причудливый способ сказать через "."то есть пунктирный атрибут доступа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...