Objektno usmjereno programiranje
Objektno usmjereno programiranje
Osnovni pojmovi
Primjer 1:
Vožnja automobila
Osnovni elementi:
autmomobil (marka, maksimalna brzina, snaga motora, broj šasije,...)
vozač (ime, prezime, visina, težina, OIB,...)
Radnje:
Uključivanje motora, ubacivanje u brzinu, dodavanje gasa,...
Osnovni pojmovi
klasa - predložak u kojem se čuvaju podaci o nekom elementu: automobil i vozač, te ima implementirane neke radnje nad podacima
elementi klase:
svojstva (atributi) – čuvaju vrijednosti važne za neki element koji opisujemo (marka automobila, maksimalna brzina, ime vozača,....)
metode – radnje koje izvodimo nad elementima (uključivanje motora, dodavanje gasa, kočenje,...)
Osnovni pojmovi
klasa - predložak u kojem se čuvaju podaci o nekom elementu: automobil i vozač, te ima implementirane neke radnje nad podacima
elementi klase:
svojstva (atributi) – čuvaju vrijednosti važne za neki element koji opisujemo (marka automobila, maksimalna brzina, ime vozača,....)
metode – radnje koje izvodimo nad elementima (uključivanje motora, dodavanje gasa, kočenje,...)
objekt – konkretizacija klase – nakon što klasi dodamo vrijednosti svojstava, konkretni element koji možemo pokazati
klasa automobil = bilo koji automobil na ovom svijetu
objekt automobil = točno određeni automobil koji možemo pokazati na ulici
Primjeri poznatih klasa Pythona
String
svojstvo – niz znakova koji je
pohranjen u stringu
metode – upper(), replace(), split(),...
lista
svojstva – članovi liste
metode – append(), sort(),...
Objektno usmjereno programiranje
u programskom jeziku Python
definicija klase:
class ImeKlase:
definiraranje klase
definiciju čini niz metoda (funkcije) te svojstva (varijable)
svaka metoda obavezno ima parametar self – preko njega dolazimo do svih svojstava i metoda klase
Objektno usmjereno programiranje
u programskom jeziku Python
konstruktor klase
osnovna metoda unutar koje se
postavljaju vrijednosti svojstava klase
posrednik koji se poziva prilikom
kreiranja objekta iz klase
def __init__(self [, parametri]):
definicija
Primjer klase - Trokut
class Trokut:
def __init__(self, a = 0, b = 0, c = 0):
self.A = a
self.B = b
self.C = c
return
def opseg(self):
return self.A + self.B + self.C
def povrsina(self):
s = self.opseg() / 2
return (s * (s - self.A) * (s - self.B) * (s –
self.C)) ** 0.5
Primjer klase - Trokut
>>> t = Trokut(3, 4, 5)
>>> t.A
3
>>> t.opseg()
12
>>> t.povrsina()
6.0
Primjer klase - Trokut
>>> t.B = 3
>>> t.C = 3
>>> t.opseg()
9
Primjer klase - Trokut
>>> t = Trokut()
>>> t.A
0
>>> t.opseg()
0
Primjer klase - Trokut
>>> t = Trokut(2, 3)
>>> t.A
2
>>> t.B
3
>>> t.C
0
Primjer klase - Trokut
>>> t = Trokut(b = 2, c = 3)
>>> t.A
0
>>> t.B
2
>>> t.C
3
Primjer klase - Trokut
unutar klase Trokut definirajmo metodu crtaj()
koja će, ukoliko se radi o pravokutnom trokutu
nacrtati taj trokut pri ćemu će vrh pravog kuta
biti u ishodištu kornjačinog koordinatnog sustava.
Trokut treba biti ispunjen bojom b, pri čemu će b
biti parametar metode. Ukoliko se ne radi o
pravokutnom trkutu metoda treba ispisati poruku
u grafičkom ekranu da trokut nije pravokutan.
Primjer klase -
Trokut
from turtle import *
def crtaj_trokut(a, b):
pu()
home()
pd()
begin_fill()
fd(a)
goto(0, b)
home()
end_fill()
return
class Trokut:
...
def crtaj(self, boja =
'black'):
color(boja)
if self.A ** 2 + self.B
** 2 == self.C ** 2:
crtaj_trokut(self.A,
self.B)
elif self.A ** 2 +
self.C ** 2 == self.B ** 2:
crtaj_trokut(self.A,
self.C)
elif self.B ** 2 +
self.C ** 2 == self.A ** 2:
crtaj_trokut(self.B,
self.C)
else:
pu()
home()
pd()
write('Trokut nije
pravokutan')
return
Primjer klase - Trokut
>>> t = Trokut(90, 120, 150)
>>> t.crtaj('blue')
Primjer klase - Razlomak
class Razlomak:
def __init__(self, b = 0, n = 1):
self.B = b
self.N = n
self.krati()
return
def krati(self):
b = self.B
n = self.N
while b != n:
if b > n:
b -= n
else:
n -= b
self.B //= b
self.N //= b
return
Primjer klase - Razlomak
>>> r = Razlomak(4, 6)
>>> r.B
2
>>> r.N
3
>>> r
<__main__.Razlomak object at 0x025FD810>
Predefinirane nazivi metoda za neke
standardne operacije u Pythonu
Naziv metode Opis
__add__(self, b) zbrajanje (+)
__sub__(self, b) oduzimanje (-)
__mul__(self, b) množenje (*)
__floordiv__(self, b) cjelobrojno dijeljenje (//)
__truediv__(self, b) dijeljenje (/)
__mod__(self, b) ostatak cjelobrojnog dijeljenja (%)
__pow__(self, n) potenciranje
__lt__(self, b)
[gt, ge, le, eq, ne]
manje (<)
(>, ≥, ≤, =, ≠)
__repr__() izgled ispisa u interaktivnom sučelju
__str__() izgled ispisa korištenjem naredbe print()
Primjer klase - Razlomak
definirajmo metodu kojom ćemo ispisati objekt tipa razlomak u interaktivnom sučelju:
def __repr__(self):
if self.B == 0:
return '0'
elif self.N == 1:
return str(self.B)
else:
return '{0} / {1}'.format(self.B, self.N)
Primjer klase - Razlomak
>>> r = Razlomak(4, 6)
>>> r
2 / 3
>>> r = Razlomak(5)
>>> print(r)
5
Primjer klase - Razlomak
definirajmo množenje i dijeljenje razlomaka:
def __mul__(self, b):
br = self.B * b.B
na = self.N * b.N
return Razlomak(br, na)
def __truediv__(self, b):
r = Razlomak(b.N, b.B)
return self * r
Primjer klase - Razlomak
>>> r1 = Razlomak(4, 6)
>>> r2 = Razlomak(4, 5)
>>> r3 = r1 * r2
8 / 15
>>> r1 / r2
5 / 6
Primjer klase - Razlomak
Implelemntirajmo operacije zbrajanja razlomaka:
def __add__(self, b):
return Razlomak(self.B * b.N + b.B *
self.N, self.N * b.N)
def __sub__(self, b):
b.B = -b.B
return self + b
Primjer klase - Razlomak
>>> r1 = Razlomak(3, 2)
>>> r2 = Razlomak(1, 2)
>>> r1 + r2
2
>>> r1 - r2
1
Primjer klase - Razlomak
definirajmo uspoređivanje razlomaka:
def __gt__(self, b):
return self.B * b.N > b.B * self.N
def __lt__(self, b):
return b > self
def __ge__(self, b):
return self.B * b.N >= b.B * self.N
def __le__(self, b):
return self.B * b.N <= b.B * self.N
def __eq__(self, b):
return self.B * b.N == b.B * self.N
def __ne__(self, b):
return self.B * b.N != b.B * self.N
Primjer klase - Razlomak
>>> r1 = Razlomak(4, 6)
>>> r2 = Razlomak(4, 5)
>>> r1 == r2
False
>>> r1 <= r2
True
>>> r2 > r1
True
Nasljeđivanje klasa
nasljeđivanjem kreiramo novu klasu koja od
prethodne klase preuzima sva svojstva i metode
te definira neka dodatna svojstva i metode
odnosno predefinira neka svojstva i metode
klase koja se nasljeđuje
klasa koja nasljeđuje neku postojeću klasu na
svojevrstan način nadograđuje tu klasu
Nasljeđivanje klasa
Nasljeđivanje klasa
unutar konstruktora nove klase moramo pozvati
konstruktor klase koju nasljeđujemo (super().__init__())
klasa može nasljediti najviše jednu klasu
klasa A nasljeđuje klasu B:
class A(B):
definicija klase A
Nasljeđivanje klasa - primjer
definirajmo klasu četverokut čija će svojstva biti duljine stranica četverokuta a imat će jednu metodu koja će vraćati opseg četverokuta:
class Cetverokut:
def __init__(self, a, b, c, d):
self.A = a
self.B = b
self.C = c
self.D = d
return
def opseg(self):
return self.A + self.B + self.C + self.D
Nasljeđivanje klasa - primjer
definirajmo klasu Pravokutnik koja nasljeđuje klasu Cetverokut te ima još metodu za računanje površine pravokutnika:
class Pravokutnik(Cetverokut):
def __init__(self, a, b):
super().__init__(a, b, a, b)
return
def povrsina(self):
return self.A * self.B
Nasljeđivanje klasa - primjer
>>> p = Pravokutnik(3, 4)
>>> p.A
3
>>> p.C
3
>>> p.opseg()
14
>>> p.povrsina()
12
Nasljeđivanje klasa - primjer
>>> c = Cetverokut(3, 4, 5, 6)
>>> c.opseg()
18
>>> c.povrsina()
Traceback (most recent call last):
File "<pyshell#88>", line 1, in <module>
c.povrsina()
AttributeError: 'Cetverokut' object has no
attribute 'povrsina'
Klasa Date
Naziv metode Opis
date(godina, mjesec, dan) konstruktor
year godina
month mjesec
day dan
weekday() redni broj dana u tjednu (0 – ponedjeljak)
today() današnji datum
toordinal() redni broj dana od 1.1.1.
fromordinal(n) datum koji dolazi n dana nakon 1.1.1.
Klasa Date- primjer
>>> from datetime import *
>>> d = date(2014, 5, 6)
>>> d
datetime.date(2014, 5, 6)
>>> d.toordinal()
735359
>>> d.day
6
Klasa Date- primjer
>>> d2 = d.fromordinal(735360)
>>> d2
datetime.date(2014, 5, 7)
>>> d2.weekday()
2
>>> d.month
5
>>> print(d)
2014-05-07
Nasljeđivanje klasa - primjer
Definirajmo klasu Datum koja nasljeđuje klasu
Date te ima implementiranu funkcionalnost ispisa
datuma u obliku dd.mm.yyyy., osim toga ima
implementirane operacije račnanja razlike dvaju
datuma (razlika je broj dana) te dodavanja
određenog broja dana nekom datumu
Nasljeđivanje klasa - primjer
class Datum(date):
def __init__(self, g, m, d):
super().__init__()
return
Nasljeđivanje klasa - primjer
def __repr__(self):
d = str(self.day)
m = str(self.month)
g = str(self.year)
if len(d) < 2:
d = '0' + d
if len(m) < 2:
m = '0' + m
return '{0}.{1}.{2}'.format(d, m, g)
def __str__(self):
return self.__repr__()
Nasljeđivanje klasa - primjer
def __add__(self, n):
k = self.toordinal()
k += n
d = self.fromordinal(k)
return Datum(d.year, d.month, d.day)
def __sub__(self, d):
return self.toordinal() –
d.toordinal()
Nasljeđivanje klasa - primjer
>>> d = Datum(2014, 5, 6)
>>> d
06.05.2014.
>>> d2 = d + 30
>>> d2
05.06.2014.
>>> d2 - d
30
Složene klase - primjer
Definirajmo klasu Ucenik čija će svojstva biti ime i
prezime učenika te datum rođenja učenika
Implementirajmo mogućnost ispisa podataka o
učeniku u interaktivnom sučelju upisivanjem
imena varijable tima Ucenik
Složene klase - primjer
class Ucenik: def __init__(self, ime, prezime, datR): self.Im = ime self.Pr = prezime self.Dr = datR return def __repr__(self): i = ' ' * (20 - len(self.Im)) + self.Im p = ' ' * (20 - len(self.Pr)) + self.Pr return i + p + ' ' + str(self.Dr)
Nasljeđivanje klasa - primjer
>>> u1 = Ucenik('Pero', 'Perić',
Datum(2000, 12, 12))
>>> u1
Pero Perić 12.12.2000.
>>> d = Datum(2000, 3, 18)
>>> u2 = Ucenik('Ana', 'Anić', d)
>>> u2
Ana Anić 18.03.2000.
Složene klase - primjer
Definirajmo klasu Razred čija će svojstva biti
oznaka razreda te lista svih učenika koji polaze u
taj razred
Implementirajmo mogućnost ispisa podataka o
razredu: oznaku razreda te popis svih učenika
razreda poredanih prema datumu rođenja
uzlazno
Definirajmo metodu dodajUcenika() koja će
dodavati učenika u razred
Složene klase - primjer
class Razred:
def __init__(self, oznaka):
self.Oz = oznaka
self.Uc = []
return
def dodajUcenika(self, uc):
self.Uc.append(uc)
return
Složene klase - primjer
def __repr__(self):
s = 'Razred: ' + self.Oz + '\n'
s += '=' * 52 + '\n'
l= sorted(self.Uc,key=lambda t:t.Dr)
for u in l:
s += str(u) + '\n'
return s
Složene klase - primjer
>>> r = Razred('2E')
>>> u = Ucenik('Pero', 'Perić',
Datum(2000, 12, 12))
>>> r.dodajUcenika(u)
>>> u = Ucenik('Ana', 'Anić',
Datum(2000, 3, 18))
>>> r.dodajUcenika(u)
Složene klase - primjer
>>> r
Razred: 2E
====================================================
Ana Anić 18.03.2000.
Pero Perić 12.12.2000.