✦ Srednji nivo Pythona i OOP Završni projekat Levela 2

L2 · Koncept 01 · Završni projekat: Task Manager

Izgradi jedan projekat.
Razvijaj ga korak po korak.

Započni mali lokalni Task Manager koji će rasti kroz poslednja četiri koncepta Levela 2.

Cilj učenjaUpoznaj i proširi početne klase Task i TaskManager, organizuj ih u pakete i razumi zašto svaka instanca TaskManagera ima sopstvenu listu zadataka.
01 Uči02 Radi lokalno03 Proveri razumevanje

Učenje kao gost

Učiš kao gost — sačuvaj svoj napredak!

Napravi besplatan nalog i uči uz Sloby AI mentora, proveru razumevanja i praćenje napretka.

Cela platforma je besplatna tokom 2026. Foundations ostaje zauvek besplatan.

Završni projekat se gradi malim, korisnim koracima.

Do sada si vežbao pojedinačne Python i OOP ideje. U završnom projektu spojićeš ih u jednu lokalnu aplikaciju: Task Manager za organizovanje manjih zadataka.

task_manager/
├── main.py
├── models/
│   ├── __init__.py
│   └── task.py
└── services/
    ├── __init__.py
    └── task_manager.py

models sadrži objekte podataka. services sadrži kod koji koordinira te objekte. main.py pokreće malu demonstraciju. Naredni koncepti će dodati operacije nad zadacima, JSON čuvanje i testove bez promene ovih odgovornosti.

Task predstavlja jedan podatak. TaskManager upravlja kolekcijom Task objekata i kasnije će nuditi operacije nad njom. Ovo razdvajanje sprečava da jedna klasa pokušava da radi sve.

↳

Stabilan dogovor projekta: Svaki Task imaće tekstualni task_id, naslov i stanje završenosti. Svaki TaskManager imaće sopstvenu listu tasks. Koncept 29 dodaje upravljanje zadacima, koncept 30 čuva podatke kao JSON, a koncept 31 proverava pravila testovima.

Prve dve klase
class Task:
    """Represent one task in the local project."""

    def __init__(self, task_id: str, title: str) -> None:
        self.task_id = task_id
        self.title = title
        self.completed = False


class TaskManager:
    """Keep this manager instance's tasks together."""

    def __init__(self) -> None:
        self.tasks: list[Task] = []

    def add_task(self, task: Task) -> None:
        self.tasks.append(task)

Konstruktor svakom TaskManageru daje novu praznu listu. Lista je instancni atribut, pa dodavanje zadatka jednom menadžeru ne dodaje ga drugom. Oznake tipova i kratki docstringovi čine nameravane uloge čitljivijim, ali ne dodaju automatsku validaciju.

Uvezi klase iz njihovih paketa
from models.task import Task
from services.task_manager import TaskManager

Tačka u importu prati foldere projekta. Prazni fajlovi __init__.py jasno označavaju ove foldere kao klasične Python pakete, što je pogodno za početnički projekat.

Pokreni prvu demonstraciju
from models.task import Task
from services.task_manager import TaskManager

first_manager = TaskManager()
second_manager = TaskManager()

first_manager.add_task(Task("task-1", "Read the project plan"))

print(len(first_manager.tasks))
print(len(second_manager.tasks))

Izlaz je 1, a zatim 0. Prvi menadžer je dobio jedan Task; drugi menadžer počinje nezavisno, bez zadataka.

Kako će projekat rasti

  1. Koncept 28 — Napravi osnovuNapravi foldere, Task, TaskManager, importe i malu demonstraciju koja može da se pokrene.
  2. Koncept 29 — Upravljaj zadacimaNadogradi add_task() jasnim funkcionalnostima za prikaz zadataka, pronalaženje zadatka, promenu njegovog statusa i brisanje.
  3. Koncept 30 — Sačuvaj lokalnoDodaj mali modul za JSON čuvanje kako bi se podaci o zadacima čuvali i učitavali iz lokalnog fajla.
  4. Koncept 31 — Zaštiti pravilaKoristi unittest da proveriš klase, ponašanje menadžera i lokalno čuvanje podataka.

Česte greške u strukturi projekta

  • Jedna zajednička lista klaseNe piši tasks = [] direktno u TaskManager za ovaj projekat. Stavi self.tasks = [] u __init__ kako bi svaki menadžer počinjao odvojeno.
  • Stavljanje svake odgovornosti u main.pyČuvaj podatke u Task, a ponašanje kolekcije u TaskManager. main.py treba da pokaže kako delovi rade zajedno.
  • Prerano pravljenje budućih funkcionalnostiJoš ne dodaj JSON fajlove ni ceo komandni meni. Najpre napravi i pokreni ovu malu osnovu.

Pokreni svoj Task Manager

Radi ovo u VS Code-u

Preuzmi jedan mali folder projekta. Sačuvaj ga i unapređuj kroz naredna tri koncepta završnog projekta.

Preuzmi početni projekat
Početni Task Manager projekat
task_manager/
├── main.py
├── models/
│   ├── __init__.py
│   └── task.py
├── services/
│   ├── __init__.py
│   └── task_manager.py
├── data/
│   └── .gitkeep
├── .gitignore
├── README_SR.md
└── README_EN.md

Ovaj početni projekat sadrži samo osnovu: Task, TaskManager, importe i demonstraciju. Namerno ne sadrži komandni meni, JSON čuvanje ni završene testove.

Otvori i pokreni početni projekat

  1. Raspakuj i otvori folderRaspakuj task_manager_starter.zip, zatim u VS Code-u izaberi File → Open Folder i odaberi raspakovani folder task_manager_starter. U dijagramima lekcije projekat se zove task_manager; raspakovani folder zadržava naziv startera.
  2. Pročitaj odgovornostiOtvori models/task.py i services/task_manager.py. Prepoznaj koja klasa predstavlja jedan zadatak, a koja upravlja kolekcijom.
  3. Pokreni demonstracijuOtvori VS Code terminal u folderu projekta i pokreni main.py. Potvrdi da dva menadžera imaju odvojene liste zadataka.
    python3 main.py
    # or: python main.py
  4. Napravi jednu malu izmenuDodaj jedan jednostavan atribut Task klasi, na primer kategoriju, pa ga prikaži u main.py. Još ne dodaj upravljanje zadacima ni JSON funkcionalnosti.
↳

Očekivani rezultat: First manager: 1 task(s) Second manager: 0 task(s) Izlaz pokazuje odvojeno instancno stanje TaskManagera.

Pre nego što zatražiš pomoć od Slobyja

  • Pokreni iz foldera projektaTerminal treba da bude u folderu task_manager pre nego što pokreneš python main.py ili python3 main.py.
  • Proveri nazive fajlova paketaZadrži models/__init__.py i services/__init__.py. Proveri pravopis imena u importima pre menjanja koda.

Šta će ovaj program ispisati?

Obrati pažnju na to gde svaki menadžer čuva svoju listu zadataka.

from models.task import Task
from services.task_manager import TaskManager

first_manager = TaskManager()
second_manager = TaskManager()

first_manager.add_task(Task("task-1", "Read the project plan"))

print(len(first_manager.tasks))
print(len(second_manager.tasks))
Izaberi izlaz

Izgrađuj samopouzdanje samostalnim radom

Pažljivo proširi osnovu

Radi u lokalnom folderu. Neka demonstracija ostane pokretljiva dok praviš jedno malo strukturno poboljšanje.

Vaš ciljDodaj jedan jednostavan atribut Task klasi, napravi Task u main.py, dodaj ga jednom TaskManageru i pokaži da drugi TaskManager i dalje ima praznu listu tasks.
task_manager/
├── main.py
├── models/task.py
└── services/task_manager.py

Radi u svom lokalnom VS Code folderu

Nagoveštaji korak po korak
  • Novi parametar konstruktora može imati podrazumevanu vrednost, tako da postojeći pozivi Task klase mogu nastaviti da rade dok dodaješ mali atribut.
  • Napravi dva odvojena TaskManager() objekta i dodaj Task samo jednom od njih.
  • Upotrebi len(first_manager.tasks) i len(second_manager.tasks) da uporediš njihovo stanje.

Pitaj Slobyja jedno vodeće pitanje o odgovornostima klasa ili importima. Može da pregleda aktivni fajl, ali ne može da pokrene ni menja lokalni projekat. Spreman si za koncept 29 kada možeš da pokreneš main.py, objasniš razliku između Task i TaskManager, napraviš malu izmenu klase i pokažeš da dve TaskManager instance ne dele istu listu zadataka.

Sloby, maskota Python AI Tutora

Tvoj mentor za učenje

Prijavite se da pitate Slobyja

Napravite besplatan nalog ili se prijavite za AI smernice tokom učenja.

Prijavite se da proverite svoje razumevanje

Napravite besplatan nalog ili se prijavite da biste dobili AI povratnu informaciju i sačuvali napredak u učenju.

Python AI Tutor · Uči razumevanjem, a ne samo pokretanjem koda.