Классы и объекты
Классы и объекты
До сих пор мы писали процедурный код: функции, переменные, циклы. Это отлично для многих задач, но при росте программы код становится труднее организовать. Объектно-ориентированное программирование (ООП) — другой способ думать о коде: не как о последовательности действий, а как о взаимодействии объектов.
Что такое объект
Объект — это данные (состояние) и поведение (действия) в одном месте. Вы уже работали с объектами: список [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__ для инициализации объектов при создании.