TradeHub – торгова площадка для купівлі та продажу товарів, натхненна платформами типу Monobazar / OLX.
MarketMasters
У цьому домашньому завданні потрібно реалізувати один з наведених нижче додатків, використовуючи архітектурний патерн MVT (Model-View-Template). Оскільки ми поки що не використовували фреймворк Django, реалізуйте додаток у консольному варіанті (використовуючи стандартний ввід/вивід Python або бібліотеку Textual), або десктопній версії (наприклад, з використанням бібліотеки Tkinter/PySide6 для графічного інтерфейсу), або веб-фреймворк Flask.
Model: Класи або структури для зберігання та маніпуляції даними (наприклад, списки, словники, класи Python для бази даних у пам'яті або файлах).
View: Логіка для відображення даних користувачу (консольний вивід, таблиці в терміналі або вікна/форми/сторінки).
Template: Шаблони для форматування виводу (наприклад, рядки з форматуванням для консолі або шаблони для GUI).
Додаткові Вимоги:
Зберігайте дані в пам'яті, файлах (наприклад, JSON/CSV) або простій базі даних (як
| from flask import Flask, request, redirect, url_for, render_template_string | |
| app = Flask(__name__) | |
| # ──────────────────────────────────────────────── | |
| # model — дані та бізнес-логіка | |
| # ──────────────────────────────────────────────── | |
| class ShoppingModel: |
| import sys | |
| import ctypes | |
| if sys.platform == "win32": | |
| console = ctypes.windll.kernel32.GetConsoleWindow() | |
| if console: | |
| ctypes.windll.user32.ShowWindow(console, 0) | |
| from PySide6.QtWidgets import ( | |
| QApplication, QMainWindow, QWidget, |
| from textual.app import App, ComposeResult, on | |
| from textual.widgets import Header, Footer, Button, Input, Static, Label, Rule | |
| from textual.containers import Vertical, Horizontal, ScrollableContainer | |
| from textual.screen import Screen | |
| # ──────────────────────────────────────────────── | |
| # Model | |
| # ──────────────────────────────────────────────── | |
| class ShoppingModel: |
| # Model: зберігає та маніпулює даними | |
| class ShoppingModel: | |
| def __init__(self): | |
| self.items = [] # список покупок: [{'name': 'Яблука', 'quantity': 5, 'price': 77}] | |
| def add_item(self, name, quantity, price): | |
| self.items.append({'name': name, 'quantity': quantity, 'price': price}) | |
| def get_all_items(self): | |
| return self.items |
| # view.py | |
| # py -m pip install rich (команда для терміналу PowerShell, якщо не встановлено) | |
| from rich.console import Console | |
| from rich.table import Table | |
| from rich.prompt import Prompt, IntPrompt | |
| console = Console(highlight=False) # глобальний об'єкт для зручності |
Напишіть протокол TemperatureSensor з використанням typing.Protocol та декоратора @runtime_checkable, який визначає контракт для датчиків температури: два методи —
Створіть чотири класи, що відповідають цьому протоколу:
Мета: закріпити інкапсуляцію (захист даних через _ та __), навчитися використовувати магічні методи для зручного інтерфейсу та організувати код у вигляді простого пакета.
Напишіть клас, який моделює реальний об’єкт із життя, де важливо захищати критичні дані та надавати зручний інтерфейс. Оберіть свій або один із трьох варіантів:
| from collections.abc import Iterable | |
| from typing import Self | |
| # узагальнений клас-стек (LIFO) | |
| class Stack[T]: | |
| def __init__(self) -> None: | |
| self._items: list[T] = [] | |
| def push(self, item: T) -> None: | |
| self._items.append(item) |