Зарегистрируйтесь, чтобы продолжить обучение

Методы Python: Введение в ООП

Имена атрибутов класса могут указывать на функции. Такие функции называются методами. Вы уже сталкивались с методами, когда работали со встроенными структурами данных. Давайте же объявим класс и метод в нем:

class C:
    def add(x, y):
        return x + y

C.add  # <function C.add at 0x7f7bee2d1c80>
C.add(4, 5)  # 9

Здесь C.add — обычная функция, о чем нам и говорит интерпретатор. Но сами по себе обычные функции, помещенные в класс, не так интересны: те же функции мы можем группировать и в модулях. Более того, обычные функции стоит объявлять именно в модулях.

Методы же нужны для того, чтобы работать с данными объектов класса. Но для этого методы должны быть связаны (bound).

Связанные методы

Вспомните, метод list.append (list — это класс, помним и это) модифицирует именно объект списка. Посмотрим на этот метод поближе:

l = []
list.append(l, 42)
l  # [42]

Я вызвал метод класса, как обычную функцию и передал первым аргументом объект списка. Метод изменил переданный список. Но ведь раньше мы вызывали этот метод в виде l.append(42)! Так вот l.append это связанная версия метода list.append: метод связан с конкретным объектом списка и знает, что именно его он должен модифицировать!

Определим класс с атрибутом и методом, затем получим экземпляр класса и посмотрим на вывод REPL для разных версий метода (связанной и не связанной):

class Foo:
    def bar():
        pass

x = Foo()
x
# <__main__.Foo object at 0x7f7beca78668>
Foo.bar
# <function Foo.bar at 0x7f7bee2d1d08>
x.bar
# <bound method Foo.bar of <__main__.Foo object at 0x7f7beca78668>>

Foo.bar — это не связанный метод, то есть обычная функция. А вот x.bar уже связан ("bound") с объектом x: обратите внимание на одну и ту же строку "<__main__.Foo object at 0x7f7beca78668>" — так Python отображает объект x.

Но как метод получает доступ к связанному объекту, спросите вы? В Python методы получают ссылку на связанный объект в качестве первого аргумента. А называть этот аргумент принято именем "self". Вот пример метода, использующего данные объекта:

class Person:
    name = 'Noname'
    def greet(self):
        print('Hello, ' + self.name + '!')

bob = Person()
bob.name = 'Bob'
bob.greet()
# => Hello, Bob!
alice = Person()
alice.greet()
# => Hello, Noname!

Именно через аргумент self метод получает доступ к атрибутам связанного объекта (и его класса, конечно же).


Дополнительные материалы

  1. Методы

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»