Методы в Python

В данной статье мы обсудим, что собой представляют методы в 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:

  1. В то время как метод вызывается только для объекта, функция является универсальной.
  2. Поскольку мы вызываем метод для объекта, он тесно с ним связан. Следовательно, он может получать доступ и работать с данными внутри класса.
  3. Метод может изменить состояние объекта. Функция не делает этого даже тогда, когда объект передается ей в качестве аргумента.

Магические методы

Магические методы – это еще одна интересная конструкция, которая имеется в языке Python. Такие методы окружаются двойным подчеркиванием до и после имени.

Другое название магического метода — дандер-метод (англ. dunder от “double underscore” – “двойное подчеркивание”).

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

Метод __init__() – не единственный магический метод. Разбор их всех является темой для отдельной статьи, но мы все же приведем несколько:

  • __add__ для переопределения оператора +;
  • __sub__ для переопределения оператора -;
  • __mul__ для переопределения оператора *;
  • __and__ для переопределения оператора &;

Это, разумеется, далеко не полный список магических методов.

На этом пока все, что мы хотели рассказать про методы Python.

Возможные вопросы на собеседованиях по методам Python

  1. Сколько всего существует методов в Python?
  2. Что такое встроенные методы Python?
  3. Как создать свой собственный метод в Python?
  4. Как добавить метод в класс Python?
  5. Как вызвать метод в одном классе из другого?

Заключение

Методы в Python очень похожи на функции, за исключением того факта, что метод привязан к объекту. Прочитав эту статью, вы узнали, как объявлять методы, что такое метод __init__() и что такое параметр self.

Перевод статьи “Python Method – Classes, Objects and Functions in Python”.

2 комментария к “Методы в Python”

  1. Пингбэк: Классы в Python – Хороший программист

  2. Пингбэк: Функция dir() в Python

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *