← Назад к вопросам

Приведи пример использования класса

2.3 Middle🔥 171 комментариев
#Другое

Комментарии (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

Вывод

Этот пример показывает, как классы помогают:

  • Организовать код — каждый класс отвечает за свою часть
  • Переиспользовать логику — наследование и композиция
  • Масштабировать — легко добавить новые типы товаров
  • Тестировать — каждый класс тестируется отдельно