objektno usmjereno programiranje - ipaq...

Post on 26-Dec-2019

20 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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.

top related