Методы в Python
Введение | |
Отличие метода от функции | |
Пример | |
__init__() | |
__init__() значения по умолчанию | |
self | |
Похожие статьи |
Введение
Это продолжение статьи
«Классы»
из раздела
«ООП в Python»
.
Здесь вы можете прочитать про обычные методы. Также такие методы называют instance methods.
classmethods
вы можете изучить
здесь
Методы это функции внутри классов. Аргументы, которые принимет метод - это объект класса, какие-то другие нужные
для этого метода аргументы.
Если говорить простыми словами - "с улицы" метод вызвать нельзя, сначала нужно сообщить хотя бы с каким классом нужно
работать.
В случае обычных методов нужно ещё и передать объект класса.
Отличие метода от функции
Под методом подразумевается обычный метод, не статический и не classmethod
Метод это функция в рамках какого-то класса.
Метод ждёт, что его применят к объекту его класса
В метод по-умолчанию нужно передавать объект его класса.
Функция ждёт что в неё передадут определённые аргументы либо работает вообще без аргументов
Аргументы могут быть как стандартными объектами так и объектами
пользовательского класса.
Это определятеся при объявлении функции
В функцию у которой нет параметров можно вообще ничего не передавать и она будет работать.
Пример
Напишем метод для класса 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__() позволяет быстрее создавать объекты данного класса.
Сравните два класса 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():
Пример использования методов класса 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.
OOP in Python | |
Classes | |
Methods | |
class variables | |
class methods | |
Static Methods | |
Inheritance | |
Special Methods | |
property decorator | |
Python | |
Functions | |
super() |
Subscribe to
@aofeed channel for updates
Visit Channel
@aofeed