Методы в Python

Содержание
Введение
Отличие метода от функции
Пример
__init__()
__init__() значения по умолчанию
self
Похожие статьи

Введение

Это продолжение статьи «Классы» из раздела «ООП в Python» .

Здесь вы можете прочитать про обычные методы. Также такие методы называют instance methods.

classmethods вы можете изучить здесь

Методы это функции внутри классов. Аргументы, которые принимет метод - это объект класса, какие-то другие нужные для этого метода аргументы.

Если говорить простыми словами - "с улицы" метод вызвать нельзя, сначала нужно сообщить хотя бы с каким классом нужно работать.

В случае обычных методов нужно ещё и передать объект класса.

Отличие метода от функции

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

Метод ждёт, что его применят к объекту его класса

В метод по-умолчанию нужно передавать объект его класса.

Функция ждёт что в неё передадут определённые аргументы либо работает вообще без аргументов

Аргументы могут быть как стандартными объектами так и объектами пользовательского класса. Это определятеся при объявлении функции

В функцию у которой нет параметров можно вообще ничего не передавать и она будет работать.

Чтобы отличать обычные функции от методов можно использовать термин свободные фукнции (free functions)

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

Пример

Напишем метод для класса Site, который будет просто выводить на экран информацию об объекте.

class Site(): def describe(self): print(f"Website {self.name} is available at {self.url} and was created in {self.established}") pass hh = Site() hh.url = "https://www.heihei.ru" hh.name = "HeiHei.ru" hh.established = 2018 hh.describe()

python method_example.py

Website HeiHei.ru is available at https://www.heihei.ru and was created in 2018

Метод работает, но если, например, забыть задать один из атрибутов - объект по-прежнему создаётся, но метод уже не работает

# hh.established = 2018

python method_example.py

Traceback (most recent call last): File "/home/andrei/python/method_example.py", line 12, in <module> hh.describe() File "/home/andrei/python/method_example.py", line 3, in describe print(f"Website {self.name} is available at {self.url} and was created in {self.established}") AttributeError: 'Site' object has no attribute 'established'

Чтобы объекты создавались сразу со всеми необходимыми атрибутами, а также для сокращения количества кода и возможности сходу комбинировать разные атрибуты используют метод __init__()

__init__()

Метод __init__() позволяет быстрее создавать объекты данного класса.

__init__() это не конструктор (с которым вы могли столкнуться, например в Java ) а инициализатор.

То есть объет прекрасно создаётся и без __init__(), который нужен для инициализации атрибутов.

Сравните два класса Site без __init__() и WebSite с __init__()

class Site(): pass hh = Site() hh.url = "https://www.heihei.ru" hh.name = "HeiHei.ru" hh.description = "Сайт о праздниках" hh.established = 2018 tb = Site() tb.url = "https://www.topbicycle.ru" tb.name = "TobBicycle" tb.description = "Обзоры на велосипеды" tb.established = 2018 print(hh.url, hh.name, hh.description, hh.established) print(tb.url, tb.name, tb.description, tb.description) class WebSite(): def __init__(self, url, name, description, established): self.url = url self.name = name self.description = description self.established = established hh = WebSite("https://www.heihei.ru", "HeiHei.ru", "Сайт о праздниках", 2018) tb = WebSite("https://www.topbicycle.ru", "TobBicycle.ru", "Обзоры на велосипеды", 2018) print(hh.url, hh.name, hh.description, hh.established) print(tb.url, tb.name, tb.description, tb.description)

python init_example.py

https://www.heihei.ru HeiHei.ru Сайт о праздниках 2018 https://www.topbicycle.ru TobBicycle.ru Обзоры на велосипеды Обзоры на велосипеды https://www.heihei.ru HeiHei.ru Сайт о праздниках 2018 https://www.topbicycle.ru TobBicycle.ru Обзоры на велосипеды Обзоры на велосипеды

Также метод __init__() позволяет создавать дополнительные атрибуты из уже заданных

Рассмотрим класс Employee, и метод __init__() который будет принимать всего два аргумента имя (first) и фамилия (last)

class Employee: def __init__(self, first, last): self.first = first self.last = last self.fullname = first + ' ' + last self.email = first + '.' + last + '@vostok.su' emp_1 = Employee('Yuri', 'Gagarin') emp_2 = Employee('Test', 'User') print(f"{emp_1.fullname} email is {emp_1.email}") print(f"{emp_2.fullname} email is {emp_2.email}")

python init_example.py

Yuri Gagarin email is Yuri.Gagarin@vostok.su Test User email is Test.User@vostok.su

С помощью метода __init__() мы без лишнего труда создали атрибуты полное имя (fullname) и электронная почта (email)

Значения по умолчанию

С помощью __init__() можно указать значения, которые получат атрибуты, в случае, если они не заданы при создании объекта.

В следующем примере, можно создавать объекты класса Cosmonaut как указывая, так и не указывая имя космонавта. Достаточно одной фамилии.

class Cosmonaut: def __init__(self, last, first = "Сosmonaut"): self.last = last self.first = first self.fullname = first + ' ' + last self.email = first + '.' + last + '@vostok.su' cosm_1 = Cosmonaut('Gagarin') cosm_2 = Cosmonaut('Alexei', 'Leonov') print(f"{cosm_1.fullname} email is {cosm_1.email}") print(f"{cosm_2.fullname} email is {cosm_2.email}")

python init_example.py

Сosmonaut Gagarin email is Сosmonaut.Gagarin@vostok.su Leonov Alexei email is Leonov.Alexei@vostok.su

Резюмируем преимущества, которые даёт нам __init__()

self

Ещё несколько слов про self

Рассмотрим скрипт method_example.py

class Dog(): bioclass = "mammal" def __init__(self, breed, name, spots): self.breed = breed self.name = name self.spots = spots def bark(self): print("WOOF!") my_dog = Dog("husky", "Barbos", True) my_dog.bark()

python method_example.py

WOOF!

Что будет если убрать из

def bark(self):

self, оставив

def bark():

python method_example.py

Traceback (most recent call last): File "/home/andrei/python/method_example.py", line 14, in <module> my_dog.bark() TypeError: bark() takes 0 positional arguments but 1 was given

Казалось бы никаких аргументов в bark() мы не передавали. Тем не менее один передался автоматически. А всё потому, что запись

my_dog.bark()

Это краткая версия

Dog.bark(my_dog)

То есть, ожидается что в метод будет передан объект данного класса. Поэтому и нужно указывать

def bark(self):

А не

def bark():

self похож на this в таких языках как C++ , Java и C#

Пример использования методов класса list

Рассмотрим список (list) в интерактивном режиме

python

>>> mylist = [1,2,3] >>> mylist.append(4) >>> mylist [1, 2, 3, 4] >>> mylist.pop() 4 >>> mylist [1, 2, 3] >>> help(mylist.insert) Help on built-in function insert: insert(index, object, /) method of builtins.list instance Insert object before index.

Похожие статьи
ООП в Python
Классы
Методы
class variables
class methods
Статические методы
Наследование
Специальные методы
Декоратор property
Python
Функции
super()