Video Thumbnail

Python.04.01 Классы (часть 1)

Программирование на Python12:06
https://www.youtube.com/watch?v=QOzjpPLg0WU

Содержание

Краткое резюме

  • Python — объектно-ориентированный язык, что позволяет более удобно и понятно моделировать сущности программы.
  • На примере задачи создания класса для геометрической фигуры — круга — показаны минусы использования кортежей, списков и словарей для описания объекта.
  • Основные проблемы: нечёткий порядок и смысл элементов, отсутствие проверки корректности данных (например, радиуса), отсутствие единых методов.
  • Решением становится определение класса с методами, что позволяет защитить данные и добавить функциональность, сохранив понятный доступ к свойствам.
  • Важно понимать этапы создания объекта в Python: сначала создаётся объект (new), потом инициализируется (init).
  • Метод для вычисления площади круга реализуется как функция класса, принимающая объект через self.
  • В дальнейшем следует подумать о проверках корректности данных (например, чтобы радиус не был отрицательным).

Почему простой тип данных не подходит для описания круга ⚪️

При моделировании круга на плоскости, который задаётся двумя координатами центра и радиусом, можно попробовать использовать разные встроенные типы Python: кортежи (tuple), списки (list), словари (dict). Однако каждый из вариантов имеет недостатки:

Кортежи

  • Кортеж неизменяемый, поэтому изменить параметры круга в программе нельзя — придётся создавать новый.
  • Легко запутаться с порядком элементов (сначала координаты, потом радиус или наоборот).
  • Индексы элементов неочевидны: что лежит под индексом 0 — X или Y?
  • Нет проверки данных: радиус может быть отрицательным, что некорректно.

Списки

  • Позволяют изменять поля объекта.
  • Проблема с индексами и порядком остаётся.
  • Игнорируется проверка корректности радиуса.
  • Появляются лишние методы, которые не нужны для круга (например, pop()).

Словари

  • Решают проблему порядка и делают код читаемее — доступ по именам.
  • Однако по-прежнему нет проверки на корректность радиуса.
  • Словари также выводят целый ряд методов, которые могут привести к ошибкам, если кто-то случайно вызовет не тот метод.

«Использование только встроенных типов данных для описания объекта приводит к множеству скрытых проблем — неконсистентности, ошибкам с индексами и порядком, отсутствию валидации.»


Объявление класса — правильный подход 👩‍💻

Объектно-ориентированное программирование решает указанные проблемы: класс объединяет как данные, так и логику их обработки.

Создание класса в Python

  • Для объявления класса используется ключевое слово class и имя класса с заглавной буквы.
  • Класс по умолчанию наследуется от object.
  • Создание экземпляра происходит в два шага:
    • метод __new__ создаёт объект,
    • метод __init__ его инициализирует.
class Circle:
    def __init__(self, x, y, radius):
        self.x = x
        self.y = y
        self.radius = radius

self — ссылка на текущий объект, с ним связываются свойства круга.

Создание и использование объектов

Создать объект класса Circle:

c = Circle(0, 0, 0)
print(c.x, c.y, c.radius)  # вывод координат и радиуса
c.radius = 10              # можно изменить радиус

«Доступ к свойствам объекта становится понятным и прямым — вместо непонятных индексов нужен просто объект.поле

Преимущества класса по сравнению с кортежами и словарями

  • Нет путаницы с индексами и порядком.
  • Легко читать и писать код.
  • Появляется возможность добавлять методы — функции, связанные с объектом.

Добавление метода для вычисления площади круга 🔢

Для решения задачи вычисления площади круга в классе можно определить метод area:

import math


class Circle:
    def __init__(self, x, y, radius):
        self.x = x
        self.y = y
        self.radius = radius

    def area(self):
        return math.pi * (self.radius ** 2)

Использование метода:

c = Circle(0, 0, 10)
print(c.area())  # Выведет площадь круга

Обратите внимание, что в методах первым аргументом всегда идёт self, через который можно обращаться к свойствам объекта. При вызове метода self передаётся автоматически.


Итоги и что делать дальше

  • Использование класса позволило объединить данные и методы работы с ними в одном объекте, что делает код проще, читаемее и надёжнее.
  • Пока не реализована проверка корректности данных (например, чтобы радиус был неотрицательным).
  • В следующей части лекции предложат способы добавить такую проверку и работать с ошибками.

«Классы в Python позволяют избавиться от хаоса индексов и состояния, делая код наиболее естественным способом моделирования объектов реального мира.»