Классы и объекты

Классы и объекты

До сих пор мы писали процедурный код: функции, переменные, циклы. Это отлично для многих задач, но при росте программы код становится труднее организовать. Объектно-ориентированное программирование (ООП) — другой способ думать о коде: не как о последовательности действий, а как о взаимодействии объектов.

Что такое объект

Объект — это данные (состояние) и поведение (действия) в одном месте. Вы уже работали с объектами: список [1, 2, 3] — объект с данными и методами (append, sort). Строка "hello" — объект с методами (upper, split).

Разница в том, что теперь вы создадите собственные типы объектов.

Что такое класс

Класс — шаблон (чертёж) для создания объектов. Он определяет, какие данные будут у объекта и что он умеет делать. Объект — конкретный экземпляр класса.

Аналогия: класс Dog — это концепция «собака»: умеет лаять, есть имя, есть порода. Объект buddy — конкретная собака Бадди, лабрадор, которая лает «гав-гав».

Определение класса

class Dog:
    pass   # пустой класс — допустимо

class Cat:
    species = "Felis catus"   # атрибут класса

Имена классов — PascalCase (каждое слово с заглавной буквы). Это соглашение Python, хотя технически можно назвать как угодно.

Создание объекта (экземпляра)

Объект создаётся вызовом класса как функции:

class Dog:
    pass

buddy = Dog()   # создать экземпляр класса Dog
rex = Dog()     # ещё один экземпляр — отдельный объект

print(type(buddy))    # <class '__main__.Dog'>
print(buddy is rex)   # False — это разные объекты

Атрибуты экземпляра

К любому объекту можно добавить атрибуты — данные, прикреплённые к конкретному экземпляру:

class Dog:
    pass

buddy = Dog()
buddy.name = "Buddy"
buddy.breed = "Лабрадор"
buddy.age = 3

print(f"{buddy.name} — {buddy.breed}, {buddy.age} года")

Это работает, но неудобно: нужно вручную добавлять атрибуты каждому объекту. Правильный способ — через метод __init__ (следующий урок).

Атрибуты класса vs атрибуты экземпляра

class Dog:
    species = "Canis lupus familiaris"   # атрибут класса — общий для всех

buddy = Dog()
rex = Dog()

print(Dog.species)    # Canis lupus familiaris
print(buddy.species)  # Canis lupus familiaris — экземпляр видит атрибуты класса
print(rex.species)    # Canis lupus familiaris

# Атрибут экземпляра перекрывает атрибут класса:
buddy.species = "особый вид"
print(buddy.species)  # особый вид
print(rex.species)    # Canis lupus familiaris — не изменился

Атрибуты класса — это данные, общие для всех экземпляров. Атрибуты экземпляра — данные конкретного объекта.

Методы

Метод — это функция, привязанная к классу. Первый параметр метода — self — ссылка на конкретный объект:

class Dog:
    def bark(self):
        print("Гав-гав!")

    def greet(self, name):
        print(f"Гав! Привет, {name}!")

buddy = Dog()
buddy.bark()         # Гав-гав!
buddy.greet("Алиса") # Гав! Привет, Алиса!

self передаётся Python автоматически — при вызове buddy.bark() Python сам передаёт buddy как self. Явно передавать его не нужно.

Проверь себя

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

class Circle:
    pass

a = Circle()
b = Circle()
c = a

Создано два объекта Circle: a и b. Переменная c ссылается на тот же объект, что и a (не создаёт новый). type(a) и type(b)<class '__main__.Circle'>.

Итог

  • Класс — шаблон; объект (экземпляр) — конкретный представитель класса.
  • class ИмяКласса: — определение класса; ИмяКласса() — создание экземпляра.
  • Атрибуты класса — общие для всех; атрибуты экземпляра — для конкретного объекта.
  • Метод — функция внутри класса; первый параметр self — ссылка на объект.
  • Имена классов — PascalCase.

В следующем уроке подробнее рассмотрим атрибуты и методы, а в уроке после — специальный метод __init__ для инициализации объектов при создании.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике