09. Основы ООП

Что такое ООП

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

Преимущества ООП:

  • Код становится более понятным и структурированным.
  • Можно многократно использовать один и тот же класс.
  • Легче добавлять и изменять функциональность.
  • Программа разбивается на независимые блоки (модули).

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

Класс — это шаблон для создания объектов. Объект — конкретный пример этого класса.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def say_hello(self): print(f'Привет! Меня зовут {self.name}, мне {self.age} лет.')

anna = Person('Анна', 25) ivan = Person('Иван', 30)

anna.say_hello() ivan.say_hello()

Результат:


Привет! Меня зовут Анна, мне 25 лет.
Привет! Меня зовут Иван, мне 30 лет.

Разбор кода

  • __init__ — конструктор, вызывается при создании объекта.
  • self — ссылка на сам объект, чтобы обращаться к его данным.
  • say_hello() — метод (функция), описывающая поведение объекта.

Атрибуты и методы

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

class Car:
    def __init__(self, brand, speed):
        self.brand = brand
        self.speed = speed

def drive(self): print(f'{self.brand} едет со скоростью {self.speed} км/ч')

car = Car('Toyota', 120) car.drive()

Результат:


Toyota едет со скоростью 120 км/ч

Изменение свойств объектов

Можно менять значения атрибутов прямо в коде:

car.speed = 150
car.drive()
Результат:

Toyota едет со скоростью 150 км/ч

Инкапсуляция

Инкапсуляция — защита данных от прямого вмешательства. Обычно это делается через методы.

class BankAccount:
    def __init__(self, owner, balance):
        self.owner = owner
        self._balance = balance  # защищённый атрибут

def deposit(self, amount): if amount > 0: self._balance += amount print('Баланс пополнен!')

def withdraw(self, amount): if amount > self._balance: print('Недостаточно средств!') else: self._balance -= amount print('Снято:', amount)

def get_balance(self): print('Текущий баланс:', self._balance)

acc = BankAccount('Анна', 1000) acc.deposit(500) acc.withdraw(200) acc.get_balance()

Результат:


Баланс пополнен!
Снято: 200
Текущий баланс: 1300

Наследование

Наследование позволяет создавать новый класс на основе старого, добавляя или изменяя функциональность.

class Animal:
    def speak(self):
        print('Животное издаёт звук')

class Dog(Animal): def speak(self): print('Собака говорит: Гав!')

class Cat(Animal): def speak(self): print('Кошка говорит: Мяу!')

for a in [Dog(), Cat(), Animal()]: a.speak()

Результат:


Собака говорит: Гав!
Кошка говорит: Мяу!
Животное издаёт звук

super(): использование родительского класса


class Animal:
    def __init__(self, name):
        self.name = name

def speak(self): print(f'{self.name} издаёт звук')

class Dog(Animal): def speak(self): super().speak() print(f'{self.name} лает: Гав-гав!')

Dog('Шарик').speak()

Результат:


Шарик издаёт звук
Шарик лает: Гав-гав!

Полиморфизм

Полиморфизм — это когда один и тот же метод работает по-разному в разных классах.

class Bird:
    def move(self):
        print('Птица летит')

class Fish: def move(self): print('Рыба плывёт')

for creature in [Bird(), Fish()]: creature.move()

Результат:


Птица летит
Рыба плывёт

Магические методы

Python имеет встроенные "магические" методы — они начинаются с двух подчёркиваний.
  • __init__ — вызывается при создании объекта.
  • __str__ — определяет, как объект выводится при print().
  • __len__ — задаёт длину объекта.

class Book:
    def __init__(self, title, pages):
        self.title = title
        self.pages = pages

def __str__(self): return f'Книга: {self.title}'

def __len__(self): return self.pages

book = Book('Python 101', 350) print(book) print('Страниц:', len(book))

Результат:


Книга: Python 101
Страниц: 350

Мини-проект: система пользователей


class User:
    def __init__(self, name, role):
        self.name = name
        self.role = role

def info(self): print(f'Имя: {self.name}, роль: {self.role}')

class Admin(User): def __init__(self, name): super().__init__(name, 'Администратор')

def delete_user(self, username): print(f'Пользователь {username} удалён!')

user1 = User('Анна', 'Пользователь') admin = Admin('Иван')

user1.info() admin.info() admin.delete_user('Анна')

Результат:


Имя: Анна, роль: Пользователь
Имя: Иван, роль: Администратор
Пользователь Анна удалён!

Практические задания

  • Создай класс Student с методом для подсчёта среднего балла.
  • Сделай класс Rectangle с методами area() и perimeter().
  • Создай класс Employee и унаследуй от него Manager с методом повышения зарплаты.

Итоги урока

Теперь вы знаете:
  • Что такое классы и объекты.
  • Как работают атрибуты, методы и self.
  • Что такое инкапсуляция, наследование и полиморфизм.
  • Как использовать ООП для организации кода и мини-проектов.