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__ і зникає при поверненні.