Що таке метод класу в Python і навіщо потрібний
Альтернативний конструктор (кілька конструкторів) класу в Python
Відразу почнемо з прикладу простого класу, який містить звичайний метод і метод класу:
class
MyClass:
def
метод(self):
return
'instance method called',
self
@classmethod
def
classmethod(cls):
return
'class method called',
cls
Як працюють методи класу в Python?
У Python, методи класу відзначаються декоратором @classmethod , отже, у наведеному вище прикладі, метод класу буде визначено функції classmethod() .
Як можна помітити, метод класу замість приймати аргумент self , приймає аргумент cls . При виклик методу цей аргумент вказує на сам клас, а не на екземпляр класу.
Оскільки метод класу має доступ тільки до аргументу cls, він не може змінювати стан екземпляра об'єкта. Для цього потрібний доступ до аргументу self. А все ж таки методи класу можуть змінювати стан класу, який застосовується до всіх екземплярів класу.
MyClass() налаштований таким чином, що реалізація кожного методу повертає кортеж для відстеження, що відбувається, і до яких частин класу чи об'єкта метод може отримати доступ.
Ось що відбувається, коли ми викликаємо метод екземпляра:
>>>
obj
=
MyClass()
>>>
obj.метод()
# ('instance method called', )
# Можна передати об'єкт 'obj' екземпляра вручну,
# для отримання того ж результату
>>>
MyClass.метод(obj)
# ('instance method called', )
Цей шматок коду підтвердив, що метод екземпляра класу має доступ до екземпляра об'єкта, надрукованого як аргумент self .
До речі, методи екземпляра можуть отримати доступ до самого класу через атрибут self.__class__ . Це робить методи екземпляра потужними з погляду обмежень доступу - можуть змінювати стан як екземпляра об'єкта, і самого класу.
Спробуємо викликати метод класу:
>>>
obj.classmethod()
# ('class method called', )
Виклик методу класу obj.classmethod() показав, що він не має доступу до об'єкта, а лише до об'єкта, що представляє сам клас (у Python все є об'єктом, навіть самі класи).
Зверніть увагу, як Python автоматично передає клас як перший аргумент функції, коли викликається MyClass.classmethod() . Виклик методу в Python через точкову нотацію запускає цю поведінку. Параметр self у методах екземпляра працює так само.
Тепер подивимося, що відбувається, коли спробувати викликати ці методи в самому класі – без попереднього створення екземпляра об'єкта:
>>>
MyClass.classmethod()
# ('class method called', )
>>>
MyClass.метод()
# Traceback (most recent call last):
# File "", line 1, in # TypeError: method() missing 1 required positional argument: 'self'
З прикладу видно, що можна викликати метод класу MyClass.classmethod() , але спроба викликати метод екземпляра MyClass.method() завершилася помилкою TypeError . Цього слід було очікувати, адже екземпляр об'єкта не створений, що означає, що Python не може заповнити аргумент self і, отже, виклик не виконується.
Для чого потрібні методи класу Python?
Наступні приклади коду повинні зробити розуміння методу класу більш зрозумілим. Далі розглянемо приклад класу, що має справу з інформацією про дату (це буде шаблон):
class
Date:
def
__init__(self,
day=0,
month=0,
year=0):
self.day
=
day
self.month
=
month
self.year
=
year
def
string_to_db(self):
return
f'self.year>-self.month>-self.day>'
Цей клас, очевидно, можна використовувати для зберігання інформації про певні дати, без інформації про часовий пояс (припустимо, що всі дати представлені у форматі UTC).
Тут є конструктор __init__ , типовий ініціалізатор екземплярів класів Python, який отримує аргументи як типовий метод екземпляра, маючи перший необов'язковий аргумент self , який містить посилання на новостворений екземпляр.
Наприклад, є кілька завдань, які можна вирішити за допомогою майбутніх методів цього класу, не тільки визначеного для прикладу методу, банального переведення числових значень у формат рядка з датою для баз даних.
Припустимо, що ми хочемо створити багато екземплярів класу Date() з інформацією про дату, що надходить із зовнішнього джерела у вигляді рядка з форматом dd.mm.yyyy . Припустимо, потрібно зробити це у різних місцях вихідного коду проекту.
Отже, що для цього потрібно зробити:
- Виконати синтаксичний аналіз рядка, одержати день, місяць і рік як три цілі численні змінні або кортеж з трьох елементів, що включає ці змінні.
- Створити екземпляр Date , передавши ці значення конструктор класу при його створенні.
Це буде виглядати так:
>>>
string_date
=
'10.10.2020'
>>>
day,
month,
year
=
map(int,
string_date.split('.'))
>>>
date
=
Date(day,
month,
year)
>>>
date.string_to_db()
# '2020-10-10'
Для виконання цього завдання, наприклад C++ або Java може реалізувати таку можливість з перевантаженням методу __init__ , але Python перевантаження методів відсутня. Замість неї необхідно використовувати метод класу (Декоратор @classmethod).
Створимо ще один "конструктор".
class
Date(object):
def
__init__(self,
day=0,
month=0,
year=0):
self.day
=
day
self.month
=
month
self.year
=
year
@classmethod
def
from_string(cls,
date_as_string):
day,
month,
year
=
map(int,
date_as_string.split('.'))
date1
=
cls(day,
month,
year)
return
date1
def
string_to_db(self):
return
f'self.year>-self.month>-self.day>'
Докладніше про перевантаження дивіться у матеріалі "Перевантаження методів у Python".
Зверніть увагуяк використовується аргумент cls в методі класу from_string() замість прямого виклику конструктора класу Date() .
Тепер створити новий екземпляр Date , так само можна наступним чином:
>>>
date1
=
Date.from_string('30.12.2020')
>>>
date1.string_to_db()
# '2020-12-30'
>>>
date2
=
Date.from_string('01.01.2021')
>>>
date2.string_to_db()
# '2021-1-1'
Розглянемо наведену вище реалізацію, щоб зрозуміти, які переваги тут є:
- Реалізовано синтаксичний аналіз рядка дати в одному місці, і тепер його можна використати повторно.
- Інкапсуляція тут чудово працює. Якщо ви вважаєте, що можете реалізувати синтаксичний аналіз рядків як єдину функцію в іншому місці, це рішення набагато краще відповідає парадигмі ООП.
- cls – це об'єкт, який містить сам клас, а не його екземпляр. Це досить круто, тому що, якщо ми успадкуємо клас Date, для всіх дочірніх елементів також буде визначено метод класу from_string() .
Використовуючи методи класу, можна додати так альтернативних конструкторів, скільки потрібно. Така поведінка може зробити інтерфейс створюваних класів самодокументованим (до певної міри, звичайно) і спростити їх використання.
- ОГЛЯДНА СТОРІНКА РОЗДІЛУ
- Простір імен та область видимості у класах
- Визначення класів
- Об'єкт класу та конструктор класу
- Створення екземпляра класу
- Метод екземпляра класу
- Що таке метод класу та навіщо потрібен
- Що таке статичний метод у класах Python і навіщо потрібний
- Атрибути класу та змінні екземпляра класу
- Кешування методів екземпляра декоратором lru_cache
- Закриті/приватні методи та змінні класу Python
- Наслідування класів
- Множинне успадкування класів
- Абстрактні класи
- Перевантаження методів у класі Python
- Перевантаження операторів у класах Python
- Що таке міксини та як їх використовувати
- Клас Python як структура даних, подібна до мови C
- Створення типів даних користувача
- Спеціальні (магічні) методи класу Python
- Базове налаштування класів Python магічними методами
- Налаштування доступу до атрибутів класу Python
- Дескриптор класу для чайників
- Протокол дескриптора класу
- Практичний приклад дескриптора
- Використання методу .__new__() у класах Python
- Спеціальний атрибут __slots__ класу Python
- Спеціальний метод __init_subclass__ класу Python
- Визначення метакласів metaclass
- Емуляція контейнерних типів у класах Python
- Інші спеціальні методи класу
- Як Python шукає спеціальні методи у класах
- Шаблон проектування Фабрика та його реалізація
🔥 Як викликати метод класу Python: простий гід програмування
Для виклику методу класу в Python вам знадобиться екземпляр класу або сам клас. Є два способи викликати метод класу:
1. З використанням екземпляра класу:
class MyClass: def my_method(self): print("Приклад методу класу") instance = MyClass() instance.my_method()
У цьому прикладі ми створюємо екземпляр класу MyClass і викликаємо метод my_method() за допомогою цього екземпляра.
2. З використанням самого класу:
class MyClass: @classmethod def my_method(cls): print("Приклад методу класу") MyClass.my_method()
У цьому прикладі ми визначаємо метод класу my_method() за допомогою декоратора @classmethod. Потім ми викликаємо цей метод, використовуючи сам клас MyClass.
Детальна відповідь
Як викликати метод класу Python?
Python класи є основними будівельними блоками об'єктно-орієнтованого програмування. Вони дозволяють створювати об'єкти з певними властивостями та поведінкою. У класах також можуть бути визначені методи, які є функціями, прив'язаними до класу.
Що таке метод класу?
p align="justify"> Метод класу є функцією, визначеною всередині класу, і може бути викликаний на об'єктах цього класу. Він має доступ до атрибутів та інших методів класу, а також може приймати та повертати значення.
Як спричинити метод класу?
Щоб викликати метод класу, необхідно спочатку створити об'єкт цього класу. Потім, використовуючи ім'я об'єкта та ім'я методу, викликати метод за допомогою оператора ".". Розглянемо приклад:
class MyClass: def my_method(self): print("Привіт, я метод класу!") # Створення об'єкта класу my_object = MyClass() # Виклик методу класу my_object.my_method()
У цьому прикладі ми створюємо клас з ім'ям MyClass, який містить метод з ім'ям my_method. Потім ми створюємо об'єкт класу MyClass і присвоюємо його змінної my_object. І, насамкінець, ми викликаємо метод " my_method " на об'єкті " my_object " . Під час виконання цього коду буде виведено наступний рядок: "Привіт, я метод класу!". Це означає, що метод класу був успішно викликаний та виконаний.
Самозвернення до методу класу
У методі класу можна звернутися до себе за допомогою ключового слова "self". Це дозволяє отримати доступ до атрибутів та інших методів класу. Розглянемо приклад:
class MyClass: def my_method(self): print("Привіт, я метод класу!") self.another_method() def another_method(self): print("Привіт, я ще один метод класу!") my_object = MyClass() my_object .my_method()
У цьому прикладі ми додаємо ще один метод з ім'ям "another_method", який також належить класу "MyClass". Метод "my_method" викликає як сам себе, а й інший метод класу "another_method". Під час виконання цього коду буде виведено таке:
Привіт я метод класу! Привіт я ще один метод класу!
Як очевидно з висновку, метод класу успішно викликає інший метод класу, демонструючи можливість взаємодії між методами класу.
Висновок
У цій статті ми розглянули, як викликати метод класу Python. Методи класу є одним із ключових елементів об'єктно-орієнтованого програмування та дозволяють створювати об'єкти з певною поведінкою. Для виклику методів класу необхідно створити об'єкт класу та використовувати оператор ".", вказуючи ім'я методу після імені об'єкта. Пам'ятайте, що методи класу можуть звертатися до атрибутів та інших методів класу, а також взаємодіяти один з одним.