Skip to content

Instantly share code, notes, and snippets.

@pelid
Last active February 19, 2019 19:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pelid/d7d9f96676cc8fe7078d97382232cf7d to your computer and use it in GitHub Desktop.
Save pelid/d7d9f96676cc8fe7078d97382232cf7d to your computer and use it in GitHub Desktop.
Методы в Python

Метод — это как функция, только удобнее

Зачем нужны методы, когда есть функции? В библиотеке Python полно удобных функций, а если их не хватает, то можно установить пакет с PYPI и взять её оттуда. Зачем вводить новую сущность?

У вас есть программа с чат-ботом для Telegram, в ней 200 строк кода. В программе используется функция len(), она вычисляет длину строк. Кроме len в коде встречаются еще три похожие функции, они делаются то же самое, но работают с другими типами данных: списками, словарями и кортежами. В названиях начинается путаница и вместо короткого len вы пишете длинное get_str_len, get_dict_len и подобные.

На функции len мучения не заканчиваются. Осталось разобраться с тремя версиями add() и с десятком str(). Добро пожаловать в мир без методов.

Метод vs Функция

Метод ведет себя как функция, привязанная к данным. Следующие две строки кода делают одинаковые вещи:

print(len('abcd'))  # выведет 4

print('abcd'.__len__())  # выведет 4

В первой строке вычисляем длину строки 'abcd' — количество символов — и выводим результат на экран. Во сторой строке для вычисления длины мы вызываем метод __len__, он привязан к строке 'abcd' и поэтому не требует аргументов.

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

print('ab'.__len__())  # выведет 2

print('abcd'.__len__())  # выведет 4

print(''.__len__())  # выведет 0

При вызове метода __len__ мы не передаем ему аргументов, но путаницы не возникает. По символу точки . Python понимает о какой строке идет речь.

На самом деле функция len() — это лишь короткая запись для вызова метода __len__. Функция len не умеет вычислять длину самостоятельно, она всегда вызывает метод __len__ и возвращает его результат. Благодаря такому трюку len умеет работать с данными разных типов.

Методы могут принимать на вход аргументы, также как функции. Пример тому - метод replace у строк. Он заменяет часть исходной строки на новый текст. В качестве аргументов принимает две строки: что ищем и на что меняем.

print('Привет username!'.replace('username', 'Петя'))
# выведет Привет Петя!

Подобно функции метод может вернуть результат своих вычислений. И тип данных результата может отличаться от данных, к которым привязан метод. Например, метод __len__ привязан к строке, но возвращает число:

print('abcdef'.__len__())  # выведет 6

Результат вызова метода можно положить в переменную:

string_with_dash = 'abcd'.replace('bc', '--')
print(string_with_dash)  # выведет a--d

До метода можно добраться через переменную:

string = 'abcd'
string_with_plus = string.replace('bc', '++++++')
print(string_with_plus.__len__())  # выведет 8

В Python строки и числа нельзя менять, можно только создавать новые. Поэтому методы строк и чисел всегда создают новый объект:

string_1 = 'abcd'
string_2 = string_1.replace('a', 'X')
string_3 = string_2.replace('b', 'X')

print(string_1)  # выведет abcd
print(string_3)  # выведет XXcd

Многие методы, доступные для строк, недоступны при работе с числами. Все зависит от типа данных, у каждого свой набор методов. Полный список можно найти в официальной документации или на просторах интернета:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment