14.1 Promenljiva self
Pre nego što prionemo na praktično izučavanje OOP-a, postoje još neke stvari koje se moraju objasniti. Jedna od tih stvari je i pojava promenljive self. Metode koje se definišu unutar neke klase imaju jednu bitnu karakteristiku koja ih razlikuje od načina na koji smo definisali obične funkcije - mi moramo da definišemo jedan dodatni parametar, koji mora da se navede na početku liste parametara u definiciji metode, i tom parametru mi ne dodeljujemo nikakvu vrednosti prilikom pozivanja metode na nekom mestu unutar našeg programa, već će tu vrednost da, za nas, obezbedi lično Python. Ova posebna promenljiva se odnosi na sam objekat te klase, i po običaju, daje joj se ime self, mada ti možeš da joj daš i bilo koje drugo ime. Programeri će ti preporučiti da koristiš baš ime self jer je to standard. Svako drugo ime koje bi želeo je u najmanju ruku, nepoželjno. Zašto? Pa zato što postoje mnoge prednosti korišćenja standardnog imena – svako ko želi da pročita tvoj program će ovo ime odmah prepoznati i znati čemu služi, a i mnogi IDE-i (Integrated Development Environments) su koncipirani tako da ti pomažu ukoliko koristiš upravo ime self .
No, dosta filozofije uz tandara-mandara. Opet ću morati da ti dam primer sa kancelarijom. U klasi sekretarica ti imaš definisan metod fotokopiranje. Imaš zaposlene dve sekretarice: sekretarica Đorđe i sekretarica Milan. Kada ti treba fotokopija nečega ti kažeš „Đorđe, fotokopiraj mi ugovor o dostavi marmelade u 50 primeraka“, a potom „Milane, fotokopiraj mi ovu fakturu u 1000 primeraka“. Na ovaj način ti znaš od koga šta da očekuješ, ako si zadao istu naredbu za obe sekretarice (i to da fotokopiraju). Na isti način i Python mora da zna koji objekat šta želi, i zato mu služi promenljiva self. Ukratko, u prvom slučaju će Đorđe da dođe da fotokopira. Promenljiva self se odnosi lično na dotičnog Đorđeta, ili, ako je Milan u pitanju – na njega. Znači self Pythonu služi da bi identifikovao objekat neke klase koji zahteva neku radnju. Ukoliko ne bi postojala ovakva promenljiva, mi bi smo za svaki pojedinačni objekat morali da pišemo posebnu metodu, ali onda i nema svrhe da se radi OOP, zar ne? Ukratko, self služi da bi metoda bila univerzalna za celu klasu, ali da bi ipak bila jedinstvena za svaki objekat pojedinačno (fotokopiranje – bilo koja sekretarica može da radi, ali sada Đorđe fotokopira dostavnicu a Milan fakturu).
Ukoliko si ranije programirao u C++/Java/C#:
Promenljiva self, koja se koristi u Python-u je ekvivalentna pokazivaču this u C++ i referenci this koja se koristi u Javi i C#.
Ako se još uvek pitaš kako Python sam dodeljuje vrednost ovoj promenljivoj self, i zašto, prilikom definisanja metode mi ne treba da definišemo i neku vrednost za nju, praktičan kancelarijski primer će sve da razjasni. Rekli smo da imamo klasu Sekretarica i da su instance (objekti) ove klase Đorđe i Milan. To bi izgledalo na primer ovako:
class Sekretarica:
def fotokopiranje(self, papir, broj_kopija):
fotokopiraj
return kopije
Đorđe = Sekretarica()
Milan = Sekretarica()
Kada pozivamo metodu ove klase, mi jedino možemo to da koristimo „kroz“ neki objekat koji treba to da uradi (mi menjamo stanje tog objekta), i to izgleda na primer ovako:
Đorđe.fotokopiranje(dostavnica, 50)
Milan.fotokopiranje(faktura, 1000)
U ovom trenutku MI znamo kojem smo objektu zadali određeni zadatak. Pogledaj u definiciju klase. Da li Python zna koji objekat radi? Pa zna, isključivo , i samo zbog ove promenljive self! Znači da je naš poziv metode u Python-u automatski konvertovan u:
Sekretarica(Đorđe, dostavnica, 50)
Sekretarica(Milan, faktura, 1000)
I to je upravo ono što je specijalno u vezi sa promenljivom self -u, i upravo to nam i omogućava da prilikom rada u OOP-u možemo da pozovemo metodu nekog objekta na ova dva načina, mada je prvi preporučljiv jer je lakši za snalaženje.
Ovo takođe znači da ako želimo da imamo metod za koji ne bi hteli da prosleđujemo nikakve dodatne argumente, onda ćemo prilikom njegove definicije ipak morati da postavimo ovaj jedan argument – self. Na primer, želimo metod koji šalje sekretaricu na pauzu (ne želimo da pošaljemo sve sekretarice koje imamo zaposlene, već samo jednu, tačno određenu):
def pauza(self):
time.sleep(20)
I, pošto se Milan umorio od ovih 1000 primeraka, šaljemo ga na mali odmor sa:
Milan.pauza()
Jednostavno, zar ne?
14 Objektno orijentisano programiranje | Indeks | 14.2 Klase |
Коментари
Постави коментар