Работа с экземплярами классов на более серьёзном уровне

Экземпляры классов как составные атрибуты


Пример 1: Система бронирования авиабилетов

Рассмотрим задачу создания системы бронирования авиабилетов. У нас будет несколько классов, каждый из которых будет использоваться в других как атрибут.

class Passenger:
    def __init__(self, name, passport_number):
        self.name = name
        self.passport_number = passport_number

class Flight:
    def __init__(self, flight_number, destination):
        self.flight_number = flight_number
        self.destination = destination

class Booking:
    def __init__(self, passenger, flight, seat_number):
        self.passenger = passenger  # Экземпляр Passenger
        self.flight = flight        # Экземпляр Flight
        self.seat_number = seat_number

    def get_booking_details(self):
        return (f"Пассажир: {self.passenger.name}, "
                f"Номер рейса: {self.flight.flight_number}, "
                f"Место: {self.seat_number}, "
                f"Направление: {self.flight.destination}")
        
# Создаем объекты Passenger и Flight
passenger = Passenger("Алексей Иванов", "123456789")
flight = Flight("SU1234", "Москва -> Нью-Йорк")

# Создаем объект Booking, передавая созданные экземпляры как атрибуты
booking = Booking(passenger, flight, "12A")

# Вывод информации о бронировании
print(booking.get_booking_details())

Вывод:

Пассажир: Алексей Иванов, Номер рейса: SU1234, Место: 12A, Направление: Москва -> Нью-Йорк

Объяснение: Этот пример демонстрирует, как классы Passenger и Flight используются как атрибуты в классе Booking. Экземпляры этих классов передаются в объект бронирования и затем используются для отображения детальной информации о рейсе и пассажире.

Пример 2: Управление заказами в ресторане

В данном примере мы создадим классы для системы управления заказами в ресторане, где у каждого заказа есть блюда и клиент.

class Dish:
    def __init__(self, name, price):
        self.name = name
        self.price = price

class Customer:
    def __init__(self, name, table_number):
        self.name = name
        self.table_number = table_number

class Order:
    def __init__(self, customer):
        self.customer = customer
        self.dishes = []  # Список экземпляров Dish

    def add_dish(self, dish):
        self.dishes.append(dish)  # Добавляем экземпляр Dish в список блюд

    def get_total_price(self):
        return sum(dish.price for dish in self.dishes)

    def print_order_details(self):
        print(f"Заказ для {self.customer.name} (столик {self.customer.table_number}):")
        for dish in self.dishes:
            print(f"- {dish.name}: {dish.price} руб.")
        print(f"Итоговая стоимость: {self.get_total_price()} руб.")

# Создаем клиента и заказы
customer = Customer("Ирина", 5)
order = Order(customer)

# Создаем блюда
dish1 = Dish("Борщ", 350)
dish2 = Dish("Салат Цезарь", 400)
dish3 = Dish("Чай", 150)

# Добавляем блюда в заказ
order.add_dish(dish1)
order.add_dish(dish2)
order.add_dish(dish3)

# Вывод информации о заказе
order.print_order_details()

Вывод:

Заказ для Ирина (столик 5):
- Борщ: 350 руб.
- Салат Цезарь: 400 руб.
- Чай: 150 руб.
Итоговая стоимость: 900 руб.

Объяснение: В этом примере у нас есть три класса: Dish (блюдо), Customer (клиент) и Order (заказ). Экземпляры класса Dish передаются в список атрибута dishes в классе Order, а сам клиент передается как атрибут. Мы можем добавить блюда в заказ и получить общую сумму, а также вывести детализированную информацию о заказе.


Сложные структуры с вложенными экземплярами классов

Пример 3: Управление проектами с командами разработчиков

Теперь рассмотрим систему управления проектами, где у каждого проекта есть менеджер и несколько разработчиков, а также различные задачи.

class Developer:
    def __init__(self, name, position):
        self.name = name
        self.position = position

class Task:
    def __init__(self, title, complexity):
        self.title = title
        self.complexity = complexity  # Уровень сложности задачи

class Project:
    def __init__(self, name, manager):
        self.name = name
        self.manager = manager  # Менеджер проекта (строка)
        self.developers = []    # Список разработчиков
        self.tasks = []         # Список задач

    def add_developer(self, developer):
        self.developers.append(developer)  # Добавляем экземпляр Developer

    def add_task(self, task):
        self.tasks.append(task)  # Добавляем экземпляр Task

    def print_project_details(self):
        print(f"Проект: {self.name}")
        print(f"Менеджер: {self.manager}")
        print("Разработчики:")
        for dev in self.developers:
            print(f"- {dev.name} ({dev.position})")
        print("Задачи:")
        for task in self.tasks:
            print(f"- {task.title}, сложность: {task.complexity}")

# Создаем проект, разработчиков и задачи
project = Project("Система управления задачами", "Анна Петрова")

developer1 = Developer("Иван Иванов", "Backend-разработчик")
developer2 = Developer("Мария Сидорова", "Frontend-разработчик")

task1 = Task("Создать API для задач", "Высокая")
task2 = Task("Разработать интерфейс", "Средняя")

# Добавляем разработчиков и задачи в проект
project.add_developer(developer1)
project.add_developer(developer2)
project.add_task(task1)
project.add_task(task2)

# Вывод информации о проекте
project.print_project_details()

Вывод:

Проект: Система управления задачами
Менеджер: Анна Петрова
Разработчики:
- Иван Иванов (Backend-разработчик)
- Мария Сидорова (Frontend-разработчик)
Задачи:
- Создать API для задач, сложность: Высокая
- Разработать интерфейс, сложность: Средняя

Объяснение: Здесь классы Developer (разработчик) и Task (задача) используются как атрибуты в классе Project (проект). Мы можем добавлять разработчиков и задачи в проект, а затем выводить всю информацию о проекте: менеджер, список разработчиков и задачи с указанием сложности.


Использование списков с экземплярами классов

Пример 4: Управление спортивной командой

Рассмотрим пример управления командой футболистов, где список игроков и тренер команды являются объектами классов.

class Player:
    def __init__(self, name, position):
        self.name = name
        self.position = position

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

class Team:
    def __init__(self, name, coach):
        self.name = name
        self.coach = coach  # Экземпляр Coach как атрибут
        self.players = []   # Список экземпляров Player

    def add_player(self, player):
        self.players.append(player)

    def print_team_details(self):
        print(f"Команда: {self.name}")
        print(f"Тренер: {self.coach.name}")
        print("Игроки:")
        for player in self.players:
            print(f"- {player.name}, позиция: {player.position}")

# Создаем команду, тренера и игроков
coach = Coach("Виктор Сергеев")
team = Team("Спартак", coach)

player1 = Player("Иван Кузнецов", "Нападающий")
player2 = Player("Алексей Смирнов", "Защитник")

# Добавляем игроков в команду
team.add_player(player1)
team.add_player(player2)

# Вывод информации о команде
team.print_team_details()

Вывод:

Команда: Спартак
Тренер: Виктор Сергеев
Игроки:
- Иван Кузнецов, позиция: Нападающий
- Алексей Смирнов, позиция: Защитник

Объяснение: Этот пример демонстрирует, как можно работать с командами и игроками. Класс Team содержит список игроков, которые добавляются через метод add_player, и тренера команды, который также передается в виде экземпляра класса Coach.

 

Эти примеры показывают, как можно создавать сложные системы с использованием объектов в качестве атрибутов других классов. Они демонстрируют возможности применения классов в реальных сценариях, таких как управление проектами, системой заказов или спортивными командами.

Перейти к следующему шагу

Комментарии