Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Пример использования класса: E-commerce система
Приведу реальный пример e-commerce системы, которая демонстрирует ключевые концепции объектно-ориентированного программирования.
Структура классов
from abc import ABC, abstractmethod
from datetime import datetime
from typing import List, Dict
from enum import Enum
from decimal import Decimal
# Перечисление статусов заказа
class OrderStatus(Enum):
PENDING = "pending"
PAID = "paid"
SHIPPED = "shipped"
DELIVERED = "delivered"
CANCELLED = "cancelled"
# Базовый класс (абстракция)
class Product(ABC):
"""Абстрактный класс для всех товаров"""
def __init__(self, id: str, name: str, price: Decimal, quantity: int):
self.id = id
self.name = name
self.price = price
self.quantity = quantity
@abstractmethod
def apply_discount(self, discount_percent: float) -> Decimal:
"""Применить скидку (реализуется в подклассах)"""
pass
def is_available(self) -> bool:
"""Товар доступен?"""
return self.quantity > 0
Наследование и полиморфизм
class PhysicalProduct(Product):
"""Физический товар (с доставкой)"""
def __init__(self, id: str, name: str, price: Decimal, quantity: int, weight_kg: float):
super().__init__(id, name, price, quantity)
self.weight_kg = weight_kg
def apply_discount(self, discount_percent: float) -> Decimal:
"""Скидка для физических товаров"""
return self.price * (1 - Decimal(discount_percent) / 100)
def get_shipping_cost(self) -> Decimal:
"""Стоимость доставки в зависимости от веса"""
return Decimal(self.weight_kg * 10) # 10 за килограмм
class DigitalProduct(Product):
"""Цифровой товар (e-book, программа)"""
def __init__(self, id: str, name: str, price: Decimal, download_link: str):
super().__init__(id, name, price, quantity=999999) # Неограниченный запас
self.download_link = download_link
def apply_discount(self, discount_percent: float) -> Decimal:
"""Скидка для цифровых товаров"""
# Цифровые товары — скидка больше
return self.price * (1 - Decimal(discount_percent + 5) / 100)
def get_download_url(self) -> str:
return self.download_link
Класс Order (корзина заказа)
class OrderItem:
"""Товар в заказе"""
def __init__(self, product: Product, quantity: int):
if quantity > product.quantity:
raise ValueError(f"Только {product.quantity} товаров доступно")
self.product = product
self.quantity = quantity
def get_total(self) -> Decimal:
"""Сумма за этот товар"""
return self.product.price * self.quantity
class Order:
"""Заказ с историей и расчетом стоимости"""
def __init__(self, customer_id: str):
self.customer_id = customer_id
self.items: List[OrderItem] = []
self.status = OrderStatus.PENDING
self.created_at = datetime.now()
self.discount_percent = 0
def add_item(self, product: Product, quantity: int) -> None:
"""Добавить товар в заказ"""
if not product.is_available():
raise ValueError(f"Товар '{product.name}' недоступен")
# Проверь, не добавлен ли уже этот товар
for item in self.items:
if item.product.id == product.id:
item.quantity += quantity
return
self.items.append(OrderItem(product, quantity))
def remove_item(self, product_id: str) -> None:
"""Удалить товар из заказа"""
self.items = [item for item in self.items if item.product.id != product_id]
def get_subtotal(self) -> Decimal:
"""Сумма без скидки"""
return sum(item.get_total() for item in self.items)
def apply_discount(self, discount_percent: float) -> None:
"""Применить скидку на весь заказ"""
if discount_percent < 0 or discount_percent > 100:
raise ValueError("Скидка должна быть 0-100%")
self.discount_percent = discount_percent
def get_total(self) -> Decimal:
"""Итоговая сумма с учетом скидки"""
subtotal = self.get_subtotal()
discount = subtotal * (Decimal(self.discount_percent) / 100)
# Добавь доставку для физических товаров
shipping = sum(
item.product.get_shipping_cost() if isinstance(item.product, PhysicalProduct) else Decimal(0)
for item in self.items
)
return subtotal - discount + shipping
def checkout(self) -> Dict[str, any]:
"""Оформление заказа"""
if not self.items:
raise ValueError("Заказ пуст")
self.status = OrderStatus.PAID
return {
"order_id": id(self), # Простой ID
"customer_id": self.customer_id,
"items_count": sum(item.quantity for item in self.items),
"subtotal": self.get_subtotal(),
"discount_percent": self.discount_percent,
"shipping": sum(
item.product.get_shipping_cost() if isinstance(item.product, PhysicalProduct) else Decimal(0)
for item in self.items
),
"total": self.get_total(),
"status": self.status.value,
}
Полный пример использования
# Создание товаров
laptopcost = PhysicalProduct(
id="LAPTOP-001",
name="MacBook Pro 14",
price=Decimal("2500.00"),
quantity=5,
weight_kg=1.6
)
ebook = DigitalProduct(
id="EBOOK-001",
name="Python для начинающих",
price=Decimal("29.99"),
download_link="https://example.com/python-guide.pdf"
)
headphones = PhysicalProduct(
id="HEAD-001",
name="Sony WH-1000XM5",
price=Decimal("399.99"),
quantity=10,
weight_kg=0.25
)
# Создание заказа
order = Order(customer_id="CUST-12345")
# Добавление товаров
order.add_item(laptop, quantity=1)
order.add_item(ebook, quantity=2)
order.add_item(headphones, quantity=1)
print(f"Товаров в заказе: {len(order.items)}")
print(f"Сумма без скидки: ${order.get_subtotal()}")
# Применение скидки
order.apply_discount(discount_percent=10)
# Вывод деталей
result = order.checkout()
print("\nДетали заказа:")
for key, value in result.items():
if key in ['total', 'subtotal', 'shipping']:
print(f"{key.capitalize()}: ${value}")
else:
print(f"{key.capitalize()}: {value}")
# Вывод:
# Товаров в заказе: 3
# Сумма без скидки: $6529.96
#
# Детали заказа:
# Order_id: 140234567890
# Customer_id: CUST-12345
# Items_count: 4
# Subtotal: $6529.96
# Discount_percent: 10
# Shipping: $50.00
# Total: $5926.96
# Status: paid
Ключевые принципы, которые здесь используются
1. Инкапсуляция — данные товара защищены внутри класса
laptop.quantity = -10 # ❌ Можно (но плохо)
# Вместо этого используй метод
if laptop.is_available():
order.add_item(laptop, 1) # ✅ Правильно
2. Наследование — PhysicalProduct и DigitalProduct наследуют от Product
# Общая логика в базовом классе
product.is_available() # Работает для всех
# Специфичная логика в подклассах
laptop.get_shipping_cost() # Только для физических
ebook.get_download_url() # Только для цифровых
3. Полиморфизм — разные классы по-разному реализуют apply_discount
# Одна функция, разное поведение
discount_laptop = laptop.apply_discount(10)
discount_ebook = ebook.apply_discount(10)
# Результаты разные из-за разной реализации!
4. Композиция — Order содержит OrderItems, которые содержат Products
order → OrderItems → Products
Вывод
Этот пример показывает, как классы помогают:
- Организовать код — каждый класс отвечает за свою часть
- Переиспользовать логику — наследование и композиция
- Масштабировать — легко добавить новые типы товаров
- Тестировать — каждый класс тестируется отдельно