Metoda __init__

14.4 Metoda __init__ 

Postoji mnogo različitih metoda kojima se daju specifična i standardna imena, i koje, ako se definišu, imaju veoma poseban značaj za Python-ove klase. Ja ću te sada upoznati i pokazati značaj metode koja se zove __init__ .
Prvo što se primećuje je naziv metode – on počinje i završava se sa dvostrukom donjom crticom. Ukoliko njen naziv ne napišemo upravo ovako, Python će smatrati da smo definisali nešto drugo, a ne __init__().
Zašto je za nas ovaj metod značajan? Pa zato što se __init__() metoda pokreće u onom trenutku kada mi kreiramo neki objekat u našem programu, tj. kada klasa inicijalizuje neki svoj objekat.
Šta ovo znači? Ovo jednostavno znači da mi ovaj specijalan metod ne pozivamo direktno u svom programu, već ga Python automatski poziva prilikom kreiranja objekta neke klase.
I, čemu ovaj metod služi?
Ova metoda je korisna da bi se obavila bilo kakva inicijalizacija objekta. U njoj definišemo neke podrazumevane parametre koje želimo da naš objekat ima kada je stvoren. Ako ti nije još uvek jasno, možeš ovaj metod da zamisliš kao kadrovsku službu u preduzeću. Ti želiš da zaposliš direktora – osobine su da treba da ima završen neki fakultet, 90 godina radnog iskustva u propalim preduzećima itd... Ako želiš da zaposliš sekretaricu, ona mora da ti se pojavi sa dugim nogama i lepim osmehom. Ako želiš da zaposliš fizičkog radnika, kada ti se pojavi na vratima on mora da bude snažan i da može da istovari 10 punih šlepera na sat. Znači, metoda __init__() nam daje objekat koji će imati očekivane karakteristike, koje su potrebne nama za neki rad.
Na primer želiš da nađeš devojku, evo je, taman po tvojoj volji:
>>> class Devojka: 
...     def __init__(self, ime, visina = 180, težina = 68, kosa = 'plava', frizura = 'duga ravna'): 
...             self.ime = ime 
...             self.visina = visina 
...             self.težina = težina 
...             self.kosa = kosa 
...             self.frizura = frizura 
...     def pozdrav(self): 
...             print('Zdravo seronjo, ja se zovem', self.ime) 
...     def opis(self): 
...             print('Ja sam', self.ime, ', visoka sam', self.visina, 'i teška', self.težina, '. Kosa mi je', self.kosa, 'i tražim dečka.') 
...     def frizer(self, boja, friz): 
...             self.kosa = boja 
...             self.frizura = friz 
... 
Za tebe sam definisao klasu Devojka, u okviru koje sam definisao metodu __init__() sa određenim parametrima – od njih nam je obavezan parametar ime (koji se nalazi odmah iza uobičajenog parametra self koji prestavlja sam objekat). Ostali parametri su opcioni jer sam im dao podrazumevane vrednosti. Zatim sam kreirao novu promenljivu (koja je, drugim rečima - polje) koje se takođe zove ime, samo što se ona odnosi na sam objekat, jer će to biti osobina nekog jedinstvenog objekta, pa je oznaka koju koristim self.ime. Obrati pažnju da će od ovog trenutka to postati dve različite promenljive, iako obe nose naziv 'ime' jedna će biti neko ime koje smo prosledili klasi, a self.ime će biti promenljiva koja pripada objektu - lično. To ne predstavlja zaista nikakav problem, jer nam oznaka sa tačkom self.ime govori da postoji nešto što se zove "ime" i da je to nešto sastavni deo objekta, koji se pojavljuje pod oznakom "self", dok je drugo „ime“ u stvari samo lokalna promenljiva. Mada deluje konfuzno, posle eksplicitne dodele vrednosti promenljivoj self.ime, mi Pythonu govorimo kome pripada koja promenljiva. 
Zatim smo redom kreirali i ostale promenljive koje opisuju objekat na neki način. Nakon toga sam definisao i uobičajene funkcije koje očekuješ od objekta klase Devojka.
E, sad... Sve je tu... Ali, gde je ta devojka?!?
Pa, nismo je još kreirali... Ako si baš zagoreo, evo ti odmah.... Dajem dve....
>>> riba = Devojka('Mara') 
>>> stidljiva = Devojka('Mašinka Spužvić', 110, težina = 110) 
Najvažnije ti je da primetiš da ja nisam direktno pozvao __init__() metod, već sam prilikom kreacije objekata prosledio argumente, koje sam stavio unutar zagrada nakon imena klase. Sada vidiš taj toliko poseban značaj ove metode – kada je definišemo, prilikom kreiranja objekta mi „podešavamo“ konkretne osobine koje želimo da ima baš taj objekat!
Sada smo u mogućnosti da koristimo polje self.ime ili self.visina (ili neko drugo) u metodama klase, ili u samom programu:
>>> riba.pozdrav() 
Zdravo seronjo, ja se zovem Mara 
>>> riba.opis() 
Ja sam Mara , visoka sam 180 i teška 68 . Kosa mi je plava i tražim dečka. 
>>> riba.frizura 
'duga ravna' 
>>> riba.frizer('crna', 'ćelava') 
>>> riba.opis() 
Ja sam Mara , visoka sam 180 i teška 68 . Kosa mi je crna i tražim dečka. 
>>> riba.frizura 
'ćelava' 
A druga devojka je isto tako devojka, ali ima neke druge atribute:
>>> stidljiva.opis() 
Ja sam Mašinka Spužvić , visoka sam 110 i teška 110 . Kosa mi je plava i tražim dečka. 
Ova stidljiva devojka je negde nestala na par meseci, a kada se vratila:
>>> stidljiva.frizer('šatirana', 'duga loknasta') 
>>> stidljiva.težina = 50 
>>> stidljiva.ime = 'Lepojka Momčilović' 
>>> stidljiva.opis() 
Ja sam Lepojka Momčilović , visoka sam 110 i teška 50 . Kosa mi je šatirana i tražim dečka. 
>>> 
Pobogu, čak je i ime promenila!
Ovo je tipičan primer, u kome mi možemo svojim uticajem da menjamo osobine svakog pojedinačnog objekta, već prema našim potrebama i zahtevima. Obrati pažnju na to da su i stidljiva i riba – devojke. Razlikuju se u svojim osobinama, iako su to u suštini – iste osobine (imaju ime, visinu, težinu, frizuru itd, ali svaka ima različito ime, frizuru itd). Većinu ovih osobina nam je, u startu, upravo pružio __init__() metod.

14.3 Metode Indeks 14.5 Promenljive
koje pripadaju
klasi ili objektu

Primjedbe

Popularno

Kako televizija štetno utiče na Vaše zdravlje finansije?

Da li je TV kviz Slagalica "prevara"?

Tu je novi Qt creator 4.4.0!

Kada prijatelji odlaze

Microsoft objavio - nova verzija Windowsa stiže...

Opet su se pojavili lažni kuponi brenda "IDEA" na društvenim mrežama

Najgore obrade velikih rock hitova

Sitnije promene na blogu...

Poslednji pozdrav izgubljenom vremenu

Ne, Marlboro ne deli besplatne cigarete!