Зачем нужны методы, когда есть функции? В библиотеке Python полно удобных функций, а если их не хватает, то можно установить пакет с PYPI и взять её оттуда. Зачем вводить новую сущность?
У вас есть программа с чат-ботом для Telegram, в ней 200 строк кода. В программе используется функция len()
, она вычисляет длину строк. Кроме len
в коде встречаются еще три похожие функции, они делаются то же самое, но работают с другими типами данных: списками, словарями и кортежами. В названиях начинается путаница и вместо короткого len
вы пишете длинное get_str_len
, get_dict_len
и подобные.
На функции len
мучения не заканчиваются. Осталось разобраться с тремя версиями add()
и с десятком str()
. Добро пожаловать в мир без методов.
Метод ведет себя как функция, привязанная к данным. Следующие две строки кода делают одинаковые вещи:
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
Многие методы, доступные для строк, недоступны при работе с числами. Все зависит от типа данных, у каждого свой набор методов. Полный список можно найти в официальной документации или на просторах интернета: