2.20. Перший клас¶
Клас об’єднує дані та функції, що працюють з цими даними, під одним іменем. Доречно звернутися до нього, коли кілька частин стану належать разом і більшість функцій у скрипті приймають однаковий набір значень як аргументи.
2.20.1. Ключове слово class¶
Ключове слово – class. Тіло містить метод __init__, який виконується кожного разу при створенні нового екземпляра:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
Виведення:
3 4
Point – це клас; p – екземпляр цього класу. Дужки в виклику Point(3, 4) викликають __init__, який присвоює аргументи атрибутам нового екземпляра. self – це умовне ім’я для екземпляра; self.x встановлює атрибут, який читатимуть решта методів екземпляра.
2.20.2. Коли використовувати клас¶
Звертайтеся до класу, коли одночасно виконуються такі умови:
Кілька пов’язаних значень завжди рухаються разом (координати
xіyточки; значення, одиниця та мітка часу показань датчика).Кілька функцій приймають однаковий набір значень і працюють з ними.
Корисно мати одночасно більше одного такого набору, розрізняючи їх між собою.
Якщо дані є разовими, зазвичай достатньо простого dict або tuple. Якщо потрібен лише один набір констант, підійдуть змінні на рівні модуля. Класи не є стандартним контейнером – вони виправдовують себе тоді, коли стан і поведінка хочуть бути разом.
2.20.3. Що робить __init__¶
__init__ – це просто звичайний метод. Усе, що присвоюється self всередині нього, стає атрибутом нового екземпляра:
class Sensor:
def __init__(self, name, unit):
self.name = name
self.unit = unit
self.readings = []
temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)
Виведення:
temperature C []
readings ініціалізується порожнім списком – кожен новий екземпляр отримує свій власний список, а не спільний. Усе, що не присвоєне self, є локальним для __init__ і зникає при поверненні.