Методы в 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
Статические методы
Наследование
Специальные методы
dataclass
__slots__
Декоратор property
super()

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: