09. Основы ООП
Что такое ООП
ООП (Объектно-ориентированное программирование) — это способ писать код, где программа состоит из объектов, у которых есть свои свойства и действия.ООП можно сравнить с жизнью: человек — это объект с характеристиками (имя, возраст) и поведением (говорит, идёт, работает).
Преимущества ООП:
- Код становится более понятным и структурированным.
- Можно многократно использовать один и тот же класс.
- Легче добавлять и изменять функциональность.
- Программа разбивается на независимые блоки (модули).
Классы и объекты
Класс — это шаблон для создания объектов. Объект — конкретный пример этого класса.
class Person:
def __init__(self, name, age):
self.name = name
self.age = agedef 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 = speeddef 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 = namedef 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 = pagesdef __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 = roledef 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.
- Что такое инкапсуляция, наследование и полиморфизм.
- Как использовать ООП для организации кода и мини-проектов.