В данной статье мы обсудим, что собой представляют методы в Python и чем они отличаются от функций. Кроме того, мы разберем, что такое метод класса и что такое объект. Также рассмотрим магические методы в Python.
Вы ведь уже в курсе, что Python — это объектно-ориентированный язык, верно? Это означает, что он может работать с классами и объектами для моделирования реального мира.
Метод в Python — это название функции, которую вы можете вызвать для конкретного объекта. Это фрагмент кода для выполнения на данном объекте.
Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU
Метод класса в Python
Класс Python — это абстрактный тип данных (ADT). Его можно представить как некий чертеж или план. Ракета, сделанная по чертежу, должна ему точно соответствовать. Она должна обладать всеми свойствами, описанными в чертеже, и вести себя соответствующим образом. Точно так же класс является своего рода планом или чертежом объекта.
В качестве примера давайте разберем автомобиль. Класс Car
(автомобиль) имеет такие свойства, как brand (марка), model (модель), color (цвет), fuel (топливо) и т. д.
Он также должен поддерживать определенного рода поведение, например такое как start()
(пуск), halt()
(остановка), drift()
(движение), speedup()
(ускорение) и turn()
(поворот). Тогда объект Hyundai Verna обладает следующими свойствами:
- Марка: ‘Hyundai’
- Модель: ‘Verna’
- Цвет: ‘Черный’
- Топливо: ‘Дизель’
Таким образом, это объект класса Car
, и мы можем назвать его car1
или blackverna
.
class Car: def __init__(self,brand,model,color,fuel): self.brand=brand self.model=model self.color=color self.fuel=fuel def start(self): pass def halt(self): pass def drift(self): pass def speedup(self): pass def turn(self): pass
Объекты в Python
Объект Python — это экземпляр класса. Он может иметь свои свойства и свое собственное поведение.
Мы только что создали класс Car
. Теперь давайте создадим объект blackverna
как экземпляр данного класса. Имейте ввиду, что вы можете использовать класс для создания любого количества объектов.
blackverna = Car('Hyundai', 'Verna', 'Black', 'Diesel')
Данный код создает объект класса Car
под названием blackverna
, с вышеупомянутыми атрибутами. Для создания объекта мы вызвали класс как функцию (в смысле синтаксиса).
Теперь давайте обратимся к атрибуту fuel. Мы это сделаем при помощи оператора .
(точка).
blackverna.fuel # Результат: # Diesel
Примечание редакции: рекомендуем также почитать о доступе к атрибутам в статье “Геттеры и сеттеры в Python”.
Методы в Python
Методы в Python напоминают функции, но их надо вызывать непосредственно на объекте класса. И чтобы создать метод, его необходимо поместить непосредственно в сам класс.
В нашем классе Car
у нас есть пять методов, а именно: start()
, halt()
, drift()
, speedup()
и turn()
. В данном примере мы в каждый из них вместо кода поместили оператор pass
, так как просто не придумали, что эти методы должны делать.
Давайте вызовем метод drift()
для нашего объекта blackverna
.
blackverna.drift()
Подобно функции, у метода есть имя, он может принимать параметры и иметь оператор return
.
Давайте рассмотрим еще один пример:
class Try: def __init__(self): pass def printhello(self,name): print(f"Hello, {name}") return name obj=Try() obj.printhello('Ayushi') # Результат: # Hello, Ayushi’Ayushi’
Таким образом, мы видим, что метод printhello()
имеет имя, принимает параметр и возвращает значение.
Интересное замечание: Когда мы вначале определили класс Car
, то не передали параметр self
во все пять методов данного класса. Это было нормально для атрибутов класса, но когда мы вызвали метод drift()
для объекта blackverna
, то получили следующую ошибку:
Traceback (most recent call last):File “<pyshell#19>”, line 1, in <module> blackverna.drift() TypeError: drift() takes 0 positional arguments but 1 was given
Из данной ошибки следует, что для всех пяти методов нам не хватает параметра self
.
Тогда мы добавили этот параметр ко всем методам класса и снова вызвали метод drift()
на объекте blackverna
. Это по прежнему не сработало, ошибка осталась. Поэтому нам пришлось заново объявить объект blackverna
, а затем повторить вызов метода для него. И в этот раз все заработало без ошибок.
Обратите внимание на эту информацию.
Метод __init__()
Если вы знакомы с любым другим объектно-ориентированным языком, то знаете, что такое конструктор.
В C++ конструктор — это специальная функция с тем же именем, что и у класса, которая используется для инициализации атрибутов класса.
В Python метод __init__()
используется с той же целью. Давайте разберем метод __init__()
в следующем классе:
class Animal: def __init__(self,species,gender): self.species=species self.gender=gender fluffy=Animal('Dog','Female') fluffy.gender # Результат: # Female
Здесь мы использовали метод __init__()
для инициализации атрибутов species
и gender
. Однако, если в этом нет необходимости, то вполне можно обойтись и без данного метода:
class Try2: def hello(self): print("Hello") obj2=Try2() obj2.hello()
Метод __init__()
является так называемым магическим методом, поэтому с обеих сторон он окружен двойным подчеркиванием.
Далее мы обсудим, что такое магические методы и какими они могут быть.
Параметр self в Python
Как вы уже заметили, мы использовали параметр self
в каждом методе, даже в __init__()
.
Это дает указание интерпретатору работать именно с текущим конкретным объектом, что похоже на использование ключевого слова this
в Java.
Чтобы понять, как это работает, давайте разберем следующий код:
class Fruit: def printstate(self,state): print(f"The orange is {state}") orange=Fruit() orange.printstate("ripe") # Результат: # The orange is ripe
Как видите, параметр self
сообщает методу, что нужно работать с текущим объектом, то есть c объектом, сохраненным в переменную orange
.
Теперь рассмотрим другой пример:
class Result: def __init__(self,phy,chem,math): self.phy=phy self.chem=chem self.math=math def printavg(self): print(f"Average={(self.phy+self.chem+self.math)/3}") rollone=Result(86,95,85) rollone.chem # Результат: # 95 rollone.printavg() # Результат: # Average=88.66666666666667
Вы также можете присваивать значения атрибутам напрямую, не передавая их через аргументы.
class LED: def __init__(self): self.lit=False obj=LED() obj.lit # Результат: # False
И в конце следует заметить, что параметр self
не является ключевым словом.
Вместо него можно использовать любое другое имя, при условии, что оно не является зарезервированным ключевым словом и соответствует правилам именования идентификатора.
class Try3: def __init__(thisobj,name): thisobj.name=name obj1=Try3('Leo') obj1.name # Результат: # Leo
Это все, что мы можем сказать про параметр self
.
Функции и методы в Python
Кажется, что мы уже достаточно узнали о методах, чтобы иметь возможность сравнить их с функциями.
Вот чем функция отличается от метода в Python:
- В то время как метод вызывается только для объекта, функция является универсальной.
- Поскольку мы вызываем метод для объекта, он тесно с ним связан. Следовательно, он может получать доступ и работать с данными внутри класса.
- Метод может изменить состояние объекта. Функция не делает этого даже тогда, когда объект передается ей в качестве аргумента.
Магические методы
Магические методы – это еще одна интересная конструкция, которая имеется в языке Python. Такие методы окружаются двойным подчеркиванием до и после имени.
Другое название магического метода — дандер-метод (англ. dunder от “double underscore” – “двойное подчеркивание”).
Магические методы используется для реализации функциональности, которую нельзя представить в виде обычного метода.
Метод __init__()
– не единственный магический метод. Разбор их всех является темой для отдельной статьи, но мы все же приведем несколько:
__add__
для переопределения оператора+
;__sub__
для переопределения оператора-
;__mul__
для переопределения оператора*
;__and__
для переопределения оператора &;
Это, разумеется, далеко не полный список магических методов.
На этом пока все, что мы хотели рассказать про методы Python.
Возможные вопросы на собеседованиях по методам Python
- Сколько всего существует методов в Python?
- Что такое встроенные методы Python?
- Как создать свой собственный метод в Python?
- Как добавить метод в класс Python?
- Как вызвать метод в одном классе из другого?
Заключение
Методы в Python очень похожи на функции, за исключением того факта, что метод привязан к объекту. Прочитав эту статью, вы узнали, как объявлять методы, что такое метод __init__()
и что такое параметр self
.
Перевод статьи “Python Method – Classes, Objects and Functions in Python”.
Пингбэк: Классы в Python – Хороший программист
Пингбэк: Функция dir() в Python