Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Методы

Методы

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

>>> 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 метод получает доступ к атрибутам связанного объекта (и его класса, конечно же).


<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

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

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

Для полного доступа к курсу, нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

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

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».

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

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

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

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».