Основные концепции ООП
1. Инкапсуляция — объединение данных и методов в одном объекте
2. Наследование — создание новых классов на основе существующих
3. Полиморфизм — использование объектов разных классов одинаковым образом
4. Абстракция — скрытие сложной реализации, показ только важных деталей
Простая аналогия:
· Инкапсуляция: Телефон — внутри сложная электроника, но мы пользуемся только кнопками
· Наследование: Смартфон наследует свойства обычного телефона + добавляет новые
· Полиморфизм: Кнопка "позвонить" работает на любом телефоне по-разному, но результат одинаковый
· Абстракция: Нам не нужно знать, как работает процессор, чтобы звонить
👍4
Преимущества использования ООП
· Понятность: Код похож на реальные объекты
· Повторное использование: Классы можно использовать много раз
· Легкость поддержки: Легко находить и исправлять ошибки
· Масштабируемость: Легко добавлять новые функции
Пример преимущества:
# Без ООП — много повторяющегося кода
car1_color = "red"
car1_brand = "Toyota"
car1_speed = 0
car2_color = "blue"
car2_brand = "BMW"
car2_speed = 0
# С ООП — чисто и понятно
car1 = Car("red", "Toyota")
car2 = Car("blue", "BMW")
👍4
Классы и объекты — основные понятия
Класс — это чертеж, объект — готовый продукт
Простая аналогия:
· Класс = Чертеж дома (описание, каким должен быть дом)
· Объект = Построенный дом (реальный экземпляр)
Пример:
# Класс — чертеж собаки
class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed
def bark(self):
return "Гав!"
# Объекты — реальные собаки
my_dog = Dog("Бобик", "Такса") # Первая собака
friends_dog = Dog("Шарик", "Овчарка") # Вторая собака
print(my_dog.name) # Бобик
print(friends_dog.bark()) # Гав!
👍4
Примеры ООП в реальных проектах
Веб-разработка:
# Пользователь на сайте
class User:
def __init__(self, username, email):
self.username = username
self.email = email
self.is_logged_in = False
def login(self):
self.is_logged_in = True
def logout(self):
self.is_logged_in = False
Игры:
# Персонаж игры
class Character:
def __init__(self, name, health):
self.name = name
self.health = health
def attack(self, enemy):
enemy.health -= 10
def heal(self):
self.health += 5
Банковское приложение:
# Банковский счет
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
else:
print("Недостаточно средств!")
👍4
Создание первого класса в Python
Простейший класс:
class Dog:
pass # pass означает "пока ничего не делай"
Что происходит:
· class — ключевое слово для создания класса
· Dog — имя класса (начинается с заглавной буквы)
· pass — заглушка, чтобы код не падал с ошибкой
Пример с содержимым:
class Dog:
# Атрибут класса (общий для всех собак)
species = "Canis familiaris"
def bark(self):
return "Гав-гав!"
👍4
Понятие self и его назначение
self — ссылка на текущий объект (экземпляр класса). Это как слово "я" для объекта.
Почему важно:
class Dog:
def __init__(self, name, age):
self.name = name # self.name = имя ЭТОЙ конкретной собаки
self.age = age
def introduce(self):
return f"Меня зовут {self.name}, мне {self.age} лет"
# Без self компьютер не поймет, чье имя и возраст показывать
👍4
Создание объектов (экземпляров класса)
Как создавать:
# Класс — чертеж
class Car:
def __init__(self, color, brand):
self.color = color
self.brand = brand
# Объекты — реальные машины
car1 = Car("red", "Toyota") # Первая машина
car2 = Car("blue", "BMW") # Вторая машина
car3 = Car("green", "Audi") # Третья машина
👍5
Атрибуты экземпляра и атрибуты класса
- Атрибуты экземпляра: Уникальные для каждого объекта
- Атрибуты класса: Общие для всех объектов
Пример:
class Dog:
# Атрибут класса (общий для всех)
species = "Canis familiaris"
def __init__(self, name):
# Атрибут экземпляра (уникальный для каждой собаки)
self.name = name
dog1 = Dog("Бобик")
dog2 = Dog("Шарик")
print(dog1.species) # Canis familiaris (общий)
print(dog2.species) # Canis familiaris (общий)
print(dog1.name) # Бобик (уникальный)
print(dog2.name) # Шарик (уникальный)
👍5
Доступ к атрибутам через точку
Как работать с объектами:
class Student:
def __init__(self, name, grade):
self.name = name
self.grade = grade
def upgrade_grade(self):
self.grade += 1
# Создаем студента
student = Student("Анна", 5)
# Чтение атрибутов
print(student.name) # Анна
print(student.grade) # 5
# Изменение атрибутов
student.grade = 6
print(student.grade) # 6
# Вызов методов
student.upgrade_grade()
print(student.grade) # 7
👍4👏2🔥1🤩1
Методы экземпляра
Самые распространенные методы:
class BankAccount:
def __init__(self, balance=0):
self.balance = balance
# Метод экземпляра - работает с конкретным объектом
def deposit(self, amount):
self.balance += amount
return f"Баланс пополнен на {amount}"
def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
return f"Снято {amount}"
return "Недостаточно средств"
# Использование
account = BankAccount(1000)
print(account.deposit(500)) # Баланс пополнен на 500
👍3👏2🔥1👌1
Методы класса @(@)classmethod
Для работы с классом в целом:
class Dog:
species = "Canis familiaris"
total_dogs = 0 # Счетчик всех созданных собак
def __init__(self, name):
self.name = name
Dog.total_dogs += 1
@classmethod
def get_total_dogs(cls): # cls - ссылка на класс, не на объект!
return cls.total_dogs
@classmethod
def change_species(cls, new_species):
cls.species = new_species
# Использование
dog1 = Dog("Бобик")
dog2 = Dog("Шарик")
print(Dog.get_total_dogs()) # 2 (всего создано собак)
Dog.change_species("Домашняя собака")
👍4🔥1👏1🤩1
Статические методы @(@)staticmethod
Функции, не требующие доступа к классу или объекту:
class MathHelper:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def is_even(number):
return number % 2 == 0
# Использование - не нужно создавать объект!
print(MathHelper.add(5, 3)) # 8
print(MathHelper.is_even(4)) # True
👍5🔥1👏1
Различия между типами методов
Методы экземпляра (обычные методы):
· Создаются БЕЗ декораторов
· Первый параметр ВСЕГДА self - это ссылка на конкретный объект
· Имеют доступ ко всем атрибутам и методам объекта
· Могут изменять состояние объекта
· Вызываются только через объект (не через класс)
Методы класса (@(@)classmethod):
· Создаются с декоратором @(@)classmethod
· Первый параметр ВСЕГДА cls - это ссылка на сам класс
· НЕ имеют доступа к атрибутам конкретного объекта
· Могут изменять атрибуты класса (общие для всех объектов)
· Вызываются как через класс, так и через объект
Статические методы (@(@)staticmethod):
· Создаются с декоратором @(@)staticmethod
· НЕТ специального первого параметра
· НЕ имеют доступа ни к объекту, ни к классу
· Это просто функции, которые живут внутри класса для удобства
· Вызываются как через класс, так и через объект
👍4🔥1😁1🤩1
Практическое применение каждого типа
Методы экземпляра — для действий объекта:
class Car:
def __init__(self, fuel):
self.fuel = fuel
def drive(self, distance):
self.fuel -= distance * 0.1 # Уменьшаем топливо
Методы класса — для утилит класса:
class User:
users = []
def __init__(self, name):
self.name = name
User.users.append(self)
@classmethod
def get_user_count(cls):
return len(cls.users) # Статистика по всем пользователям
Статические методы — для вспомогательных функций:
class DateValidator:
@staticmethod
def is_valid_date(day, month, year):
# Проверка без создания объекта
return 1 <= day <= 31 and 1 <= month <= 12
👍5🔥1😁1
Публичные атрибуты и методы
Доступны отовсюду:
class BankAccount:
def __init__(self, owner, balance):
self.owner = owner # Публичный атрибут
self.balance = balance # Публичный атрибут (опасно!)
def show_balance(self): # Публичный метод
return f"Баланс: {self.balance}"
account = BankAccount("Иван", 1000)
print(account.balance) # 1000 - можно прочитать
account.balance = -500 # 😱 Можно изменить на отрицательное!
👍5😁1🤩1
Защищенные атрибуты (_одиночное подчеркивание)
class BankAccount:
def __init__(self, owner, balance):
self.owner = owner
self._balance = balance # Защищенный атрибут
def get_balance(self):
return self._balance
def _validate_amount(self, amount): # Защищенный метод
return amount > 0
account = BankAccount("Иван", 1000)
print(account._balance) # ❌ Не рекомендуется, но возможно
👍4🤔3😁1
Приватные атрибуты (__двойное подчеркивание)
class BankAccount:
def __init__(self, owner, balance):
self.owner = owner
self.__balance = balance # Приватный атрибут
def deposit(self, amount):
if amount > 0:
self.__balance += amount
def get_balance(self):
return self.__balance
account = BankAccount("Иван", 1000)
print(account.__balance) # ❌ Ошибка! AttributeError
print(account.get_balance()) # ✅ 1000 - через метод
👍5🔥1👌1
Свойства @(@)property
Красивая работа с приватными атрибутами:
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def celsius(self):
return self._celsius
@property
def fahrenheit(self):
return (self._celsius * 9/5) + 32
temp = Temperature(25)
print(temp.celsius) # 25 - как атрибут, но это метод!
print(temp.fahrenheit) # 77.0
👍3😁2🔥1👌1
Сеттеры и геттеры
Контроль при установке значений:
class BankAccount:
def __init__(self, balance):
self.__balance = balance
@property
def balance(self):
return self.__balance
@balance.setter
def balance(self, value):
if value >= 0:
self.__balance = value
else:
print("Баланс не может быть отрицательным!")
account = BankAccount(1000)
account.balance = 1500 # ✅ Работает
account.balance = -500 # ❌ "Баланс не может быть отрицательным!"
👍3🔥1👏1👌1