Gradnja razreda v Pythonu

Gradnja razreda v Pythonu

Avtor: Svetlana Novak

Učni cilji: Gradnja razreda v Pythonu

Gradnja razreda - naloga

Naloga: Knjižnica

  1. Sestavite razred Knjiga, ki vsebuje spodnje podatke. Sestavite konstruktor, get/set metode in metodo str.

    • naslov
    • avtor
    • število strani (pozitivno celo število)
    • izposojeno (true/false)
  2. Sestavite naslednika KnjigaZaOtroke, ki vsebuje še lastnosti

    • starost, za katero je knjiga namenjena
    • število slik
  3. Sestavite naslednika Knjige imenovanega KnjigaZaOdrasle, ki vsebuje še lastnost

    • žanr
  4. Raziskava o psihologiji otrok je pokazala, da otroci ne marajo predebelih knjig. Največje število strani, ki ga prenesejo je starost * 10. Popravite konstruktor in set metode, da bodo število strani avtomatsko omejile.
  5. Sestavite metodo popularnost(). Za otroške knjige se popularnost izračuna po formuli 5 * število slik + starost * 10 / število strani Za odrasle pa je formula odvisna od žanra

    • kriminalka = 100
    • ljubezenska = 80
    • fantazijska = 60
    • klasika = 40

Sestavite program Knjiznica, ki vsebuje tabelo knjig in zna stranki ponuditi najpopularnejšo knjigo, ki trenutno ni izposojena.

Opomba: metodo popularnost() definirajte v razredu Knjiga (lahko vrne karkoli, npr. vedno 50) in prekrijte v naslednikih, kjer računa po ustrezni formuli.

V glavnem programu sestavite seznam, katerega elementi pa naj bodo tipov KnjigaZaOdrasle ali KnjigaZaOtroke.

Gradnja razreda - Analiza

Analiza

Problem knjižnice rešimo s tremi razredi: vrhnji razred Knjiga in dva izpeljana razreda KnjigaZaOtroke in KnjigaZaOdrasle.

Razred Knjiga, ki je vrhnji razred, vsebuje naslednje

  • lastnosti: naslov (niz), avtor (niz), številoStrani (pozitivno celo število), izposojeno (True/False)
  • konstruktor __init__ , metoda za izpis __str__
  • GET in SET metode za dostop do/nastavljanje stanj (enkapsulacija): nastaviNaslov, povejNaslov, nastaviAvtor, povejAvtor, nastaviŠtStrani, povejŠtStrani, nastaviIzposojeno, povejIzposojeno
  • metoda za določanje popularnosti: popularnost, ki vrne vrednost 50.



Razred KnjigaZaOtroke vsebuje naslednje:

  • izpeljan iz razreda Knjiga
  • dodatne lastnosti: starost (pozitivno celo število), štSlik (pozitivno celo število, lahko tudi 0)
  • v konstruktor dodamo še novi lastnosti, ostali podatki so izpeljani iz Knjiga
  • GET in SET metode za dostop do/nastavljanje stanj: nastaviStarost, povejStarost, nastaviŠtSlik, povejŠtSlik
  • metoda za omejevanje števila strani glede na starost otroka: omejiŠtStrani (uporabljena v konstruktorju za povezavo št. strani s starostjo in za omejevanje št. strani v nastavljanju št. strani)
  • metoda za določanje popularnosti: popularnost, ki vrne izračunano vrednost 5 * število slik + starost * 10 / število strani.



Razred KnjigaZaOdrasle vsebuje naslednje:

  • izpeljan iz razreda Knjiga
  • dodatne lastnosti: žanr (niz)
  • v konstruktor dodamo še novo lastnost, ostali podatki so izpeljani iz Knjiga
  • GET in SET metode za dostop do/nastavljanje stanj: nastaviŽanr, povejŽanr.
  • metoda za določanje popularnosti: popularnost, ki vrne vrednost, ki je odvisna od žanra knjiga (kriminalka = 100, ljubezenska = 80, fantazijska = 60, klasika = 40).



Glavni program vsebuje:

  • seznam knjig za otroke sezKnjigeZaOtroke (seznam iz objektov KnjigeZaOtroke)
  • funkcije: najpopProstaKnjiga (poišče najpopularnejšo prosto knjigo).
(DN3_n7.png)
Slika 1: Koda za knjižnico (razred Knjiga).

Gradnja razreda - Razred Knjiga

Razred Knjiga

Najprej kreiramo razred Knjiga. Pred imenom razreda uporabimo rezervirano ime class. Ob imenu razreda ni oklepajev oz. parametrov.

(DN3_n8.png)

Sledi dodajanje konstruktorja, v kateri je koda, ki se izvede ob tvorbi objekta.

(DN3_n9.png)

Nato napišemo metodo __str__ , ki pove, kako je objekt videti kot niz, oz. kaj vrne objekt v npr. print(), str().

(DN3_n10.png)

Sledijo metode za dostop do stanj get in za nastavljanje stanj set . Metode omogočajo skrivanje podatkov in možnost kontrole stanja.

(DN3_n11.png)

V izpeljanih razredih bo metoda popularnost() zelo pomembna. V tem vrhnjem razredu pa vrnemo samo vrednost, ki je 50.

(DN3_n14.png)

self pomeni objekt, ki ga obdelujemo, v konstruktorju pa je to objekt, ki ga ustvarjamo. self se uporablja znotraj metod razreda.


Primer uporabe razreda Knjiga:

(DN3_n12.png)

Rešitve zgornje uporabe:

(DN3_n13.png)

V zgornji nalogi smo ustvarili en objekt brez parametrov, kar nam tudi vrne metoda __str__ . Potem smo z uporabo vseh get in set metod preverili pravilnost napisanih metod.

Gradnja razreda - Izpeljani razred 1

Izpeljani razred KnjigaZaOtroke

Iz razreda Knjiga izpeljemo razred KnjigaZaOtroke. Pred imenom razreda uporabimo rezervirano ime class, ob imenu razreda pa v oklepajih napišemo ime vrhnjega razreda.

(DN3_n15.png)

Sledi sprememba podedovanega konstruktorja: na začetku kličemo __init__ metodo razreda Knjiga z vsemi parametri, potem pa dodam še nastavljanje vrednosti dvem novim lastnostim. Število strani popravljamo glede na starost, ki je nova lastnost izpeljanega razreda.

(DN3_n16.png)

V metodo __str__ , ki pove, kako je objekt videti kot niz, dodam še izpis starosti otroka.

(DN3_n17.png)

Sledi koda metode za dostop do stanj get in za nastavljanje stanj set , ki jih v razredu Knjiga nimamo, dodani pa sta zaradi dveh novih lastnosti. V konstruktorju in metodi nastaviŠtStrani() sem uporabila metodo omejiŠtStrani(), ki nam glede na starost otroka spremeni število strani na starost*10 strani.

(DN3_n18.png)

Metoda popularnost() v razredu KnjigaZaOtroke vrne izračunano vrednost glede na stanje nekaterih lastnosti tega razreda. Tega izračuna v razredu Knjiga z istoimensko metodo ni. Metoda podrazreda je prekrila metodo vrhnjega razreda. Postopek se imenuje prekrivanje (predefiniranje oz. overriding).

(DN3_n19.png)

self pomeni objekt, ki ga obdelujemo, v konstruktorju pa je to objekt, ki ga ustvarjamo. self se uporablja znotraj metod razreda.


Primer uporabe razreda KnjigaZaOtroke:

(DN3_n20.png)

Rešitve zgornje uporabe:

(DN3_n21.png)

V zgornji nalogi smo ustvarili en objekt brez parametrov, kar nam tudi vrne metoda __str__ . Potem smo z uporabo vseh get in set metod preverili pravilnost napisanih metod.

Gradnja razreda - Izpeljani razred 2

Izpeljani razred KnjigaZaOdrasle

Iz razreda Knjiga izpeljemo razred KnjigaZaOdrasle. Pred imenom razreda uporabimo rezervirano ime class, ob imenu razreda pa v oklepajih napišemo ime vrhnjega razreda.

(DN3_n22.png)

Sledi sprememba podedovanega konstruktorja: na začetku kličemo __init__ metodo razreda Knjiga z vsemi parametri, potem pa dodam še nastavljanje vrednosti novi lastnosti žanr.

(DN3_n23.png)

V metodo __str__ , ki pove, kako je objekt videti kot niz, dodam še izpis žanra knjige.

(DN3_n24.png)

Sledi koda metode za dostop do stanj get in za nastavljanje stanj set , ki jih v razredu Knjiga nimamo, dodani pa sta zaradi nove lastnosti žanr.

(DN3_n25.png)

Metoda popularnost() v razredu KnjigaZaOdrasle vrne vrednost glede na stanje lastnosti žanr tega razreda. Metoda podrazreda popularnsot() je prekrila metodo vrhnjega razreda. Postopek se imenuje prekrivanje (predefiniranje oz. overriding).

(DN3_n26.png)




Primer uporabe razreda KnjigaZaOdrasle:

(DN3_n27.png)

Rešitve zgornje uporabe:

(DN3_n28.png)

Gradnja razreda - Glavni program (uporaba objektov)

Glavni program

V glavnem programu imamo seznam sezKnjigeZaOtroke in zanko, v kateri vnašamo podatke. Podatki so zakriti v razredu KnjigaZaOtroke, vpisujemo s konstruktorjem.

Na koncu poiščemo najbolj popularno neizposojeno knjigo in sicer uporabljamo funkcijo najpopProstaKnjiga() - je funkcija in ne metoda, ker se nahaja izven razreda -, v katero vstavimo seznam objektov in z znano metodo preverimo, ali je prosta in izračunamo njeno popularnost. Ta funkcija vrne knjigo, ki je najbolj popularna.


Primer uporabe razreda KnjigaZaOtroke:

(DN3_n29.png)
Slika 2: Koda glavnega programa.

Rešitve zgornje uporabe:

(DN3_n30.png)
Slika 3: Rešitve programa.

Gradnja razreda - Datoteke z rešitvami

0%
0%