HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Имена атрибутов класса могут указывать на функции. Такие функции называются<em>методами</em>. Вы уже сталкивались с методами, когда работали со встроенными структурами данных. Давайте же объявим класс и метод в нем:</p>
1 <p>Имена атрибутов класса могут указывать на функции. Такие функции называются<em>методами</em>. Вы уже сталкивались с методами, когда работали со встроенными структурами данных. Давайте же объявим класс и метод в нем:</p>
2 <p>Здесь C.add - обычная функция, о чем нам и говорит интерпретатор. Но сами по себе обычные функции, помещенные в класс, не так интересны: те же функции мы можем группировать и в модулях. Более того, обычные функции стоит объявлять именно в модулях.</p>
2 <p>Здесь C.add - обычная функция, о чем нам и говорит интерпретатор. Но сами по себе обычные функции, помещенные в класс, не так интересны: те же функции мы можем группировать и в модулях. Более того, обычные функции стоит объявлять именно в модулях.</p>
3 <p>Методы же нужны для того, чтобы работать с данными объектов класса. Но для этого методы должны быть<em>связаны (bound)</em>.</p>
3 <p>Методы же нужны для того, чтобы работать с данными объектов класса. Но для этого методы должны быть<em>связаны (bound)</em>.</p>
4 <h2>Связанные методы</h2>
4 <h2>Связанные методы</h2>
5 <p>Вспомните, метод list.append (list - это класс, помним и это) модифицирует именно объект списка. Посмотрим на этот метод поближе:</p>
5 <p>Вспомните, метод list.append (list - это класс, помним и это) модифицирует именно объект списка. Посмотрим на этот метод поближе:</p>
6 <p>Мы вызвали метод класса как обычную функцию и передали первым аргументом объект списка. Метод изменил переданный список. Но ведь раньше мы вызывали этот метод в виде l.append(42). Так вот l.append это<em>связанная</em>версия метода list.append: метод связан с конкретным объектом списка и знает, что именно его он должен модифицировать.</p>
6 <p>Мы вызвали метод класса как обычную функцию и передали первым аргументом объект списка. Метод изменил переданный список. Но ведь раньше мы вызывали этот метод в виде l.append(42). Так вот l.append это<em>связанная</em>версия метода list.append: метод связан с конкретным объектом списка и знает, что именно его он должен модифицировать.</p>
7 <p>Определим класс с атрибутом и методом, затем получим экземпляр класса и посмотрим на вывод REPL для разных версий метода (связанной и не связанной):</p>
7 <p>Определим класс с атрибутом и методом, затем получим экземпляр класса и посмотрим на вывод REPL для разных версий метода (связанной и не связанной):</p>
8 <p>Foo.bar - это не связанный метод, то есть обычная функция. А вот x.bar уже связан ("bound") с объектом x: обратите внимание на одну и ту же строку "&lt;__main__.Foo object at 0x7f7beca78668&gt;" - так Python отображает объект x.</p>
8 <p>Foo.bar - это не связанный метод, то есть обычная функция. А вот x.bar уже связан ("bound") с объектом x: обратите внимание на одну и ту же строку "&lt;__main__.Foo object at 0x7f7beca78668&gt;" - так Python отображает объект x.</p>
9 <p>Но как метод получает доступ к связанному объекту? В Python методы получают<em>ссылку</em>на связанный объект в качестве<em>первого аргумента</em>. А называть этот аргумент принято именем "self". Вот пример метода, использующего данные объекта:</p>
9 <p>Но как метод получает доступ к связанному объекту? В Python методы получают<em>ссылку</em>на связанный объект в качестве<em>первого аргумента</em>. А называть этот аргумент принято именем "self". Вот пример метода, использующего данные объекта:</p>
10 <p>Именно через аргумент self метод получает доступ к атрибутам связанного объекта и его класса по цепочке.</p>
10 <p>Именно через аргумент self метод получает доступ к атрибутам связанного объекта и его класса по цепочке.</p>