Professional Documents
Culture Documents
4. Predavanje
Python – napredne OOP teme
Dušan Mišljenčević
Podsjetnici
print (string1.swapcase())
'''Custom exception'''
print (string2.swapcase())
class MojException(Exception):
pass
def provjeraPoslovnogPravila():
try:
x = int(input('Unesi cijeli broj veći od 2'))
if x <=2:
raise MojException("Broj mora biti veći od 2")
except MojException as e:
print('Korisnička pogreška:',e)
provjeraPoslovnogPravila()
print (type(Person))
<class 'type’>
<class '__main__.Person'>
print(Person.__dict__)
print(Person.__doc__)
print(Person.__name__)
print(Person.__module__)
print(Person.__bases__)
{'__module__': '__main__', '__doc__': 'Ovdje opisujemo što klasa radi', '__dict__': <attribute '__dict__' of
'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>}
Ovdje opisujemo što klasa radi
Person
__main__
(<class 'object'>,)
class Person():
pass
p = Person()
print (p.__class__)
print (type(p) is p.__class__)
<class '__main__.Person'>
True
p = Person()
print (isinstance(p, Person))
print (isinstance(p, str))
True
False
Person Program
Python
3.9
3.10
def pozdrav():
print ('Pozdravlja vas {Program.language}')
print (Program.__dict__)
{'__module__': '__main__', 'language': 'Python', 'version': '3.9', 'pozdrav': <function Program.pozdrav at
0x0000019C6162D820>, '__dict__': <attribute '__dict__' of 'Program' objects>, '__weakref__': <attribute '__weakref__' of
'Program' objects>, '__doc__': None}
print(Stan.__dict__)
nekaInstanca = NekaKlasa()
print (nekaInstanca.broj)
nekaInstanca.broj = 5
print (NekaKlasa.broj, nekaInstanca.broj)
1
15
class NekaKlasa():
broj = 1
NekaKlasa.broj += 1
nekaNovaInstanca = NekaKlasa()
print (NekaKlasa.broj, nekaNovaInstanca.broj)
nekaNovaInstanca.broj += 1
print (NekaKlasa.broj, nekaNovaInstanca.broj)
22
23
class MojaKlasa():
moj_atr = 'abc'
print (MojaKlasa.moj_atr)
inst1 = MojaKlasa()
MojaKlasa.moj_atr='123'
inst1.moj_atr = 'def'
print (MojaKlasa.moj_atr, inst1.moj_atr)
abc
123 def
def __init__(self):
BrojacInstanci.brInstanci += 1
prvaInstanca = BrojacInstanci()
print (BrojacInstanci.brInstanci)
drugaInstanca = BrojacInstanci()
print (BrojacInstanci.brInstanci)
trecaInstanca = BrojacInstanci()
print (BrojacInstanci.brInstanci)
prvaInstanca = BrojacInstanci()
print (BrojacInstanci.brInstanci)
1
2
3
4
prvaInstanca = BrojacInstanci()
print (BrojacInstanci.brInstanci)
drugaInstanca = BrojacInstanci()
print (BrojacInstanci.brInstanci)
trecaInstanca = BrojacInstanci()
print (BrojacInstanci.brInstanci)
prvaInstanca = BrojacInstanci() 1
print (BrojacInstanci.brInstanci) 2
3
BrojacInstanci.ponistiBrojac()
4
prvaInstanca = BrojacInstanci() 1
print (BrojacInstanci.brInstanci)
prvaInstanca = BrojacInstanci()
prvaInstanca.ponistiBrojac()
drugaInstanca = BrojacInstanci()
drugaInstanca. ponistiBrojacNestat()
1. primjerak
0. primjerak
1. primjerak
0. primjerak
• Jednakost po identitetu
class Test():
nekaVar = 0
prviTest = Test()
drugiTest = prviTest
print (prviTest == drugiTest)
True
class Test1():
nekaVar = 0
prviTest = Test()
drugiTest = Test1()
print (prviTest == drugiTest)
False
• Ekvivalentnost objekta
class Ekvivalent():
def __init__(self, var):
self._var = var
def __eq__(self, NekaTestKlasa):
return(self._var == NekaTestKlasa._var)
prvaInstanca = Ekvivalent(5)
drudaInstanca = Ekvivalent(5)
print (prvaInstanca == drudaInstanca)
True
class Student():
def __init__(self, prosjek):
self.prosjek = prosjek
def __eq__(self, DrugiStudent):
return(self.prosjek == DrugiStudent.prosjek)
student1 = Student(4.5)
student2 = Student(4.5)
print (student1 == student2)
True
class Osoba():
def __init__(self, ime, prezime):
self.ime = ime
self.prezime = prezime
def __hash__(self):
return hash((self.ime, self.prezime))
def __eq__(self, DrugaOsoba):
return(self.ime == DrugaOsoba.ime and self.prezime == DrugaOsoba.prezime)
pp = Osoba('Pero', 'Perić')
kk = Osoba('Krešo', 'Krešić')
ss = Osoba(‘Stipe', 'Stipić')
mjestoRodjenja = {
pp: 'Zagreb',
kk: 'Rijeka',
ss: 'Split',
Osoba('Niko', 'Nikić'): 'Dubrovnik',
Osoba('Frane', 'Franić'): 'Šibenik'
}
print(mjestoRodjenja[pp])
Zagreb
class BrojanjeObjekata():
broj = 0
aktivnih = 0
def __init__(self):
BrojanjeObjekata.broj += 1 Kreiran je objekt broj 1
self.brObjekata = BrojanjeObjekata.broj
print ('Kreiran je objekt broj {0}'.format(self.brObjekata)) U memoriji je 1 objekata
BrojanjeObjekata.aktivnih += 1 Kreiran je objekt broj 2
print ('U memoriji je {0} objekata'.format(BrojanjeObjekata.aktivnih)) U memoriji je 2 objekata
def __del__(self): Kreiran je objekt broj 3
print ('Obrisan je objekat broj {} '.format(self.brObjekata)) U memoriji je 3 objekata
BrojanjeObjekata.aktivnih -= 1
Obrisan je objekat broj 1
print ('Preostalo je u memoriji {} objekata'.format(BrojanjeObjekata.aktivnih))
Preostalo je u memoriji 2 objekata
k1 = BrojanjeObjekata() Obrisan je objekat broj 2
k2 = BrojanjeObjekata() Preostalo je u memoriji 1 objekata
kk = k1 Obrisan je objekat broj 3
k3 = BrojanjeObjekata()
Preostalo je u memoriji 0 objekata
with open("test.txt") as f:
data = f.read()
• Primjer
class ContextUpravitelj():
def __init__(self):
print ('__init__()')
def __del__(self):
print ('__del__()')
def __enter__(self):
print ('__enter__()')
return self
def __exit__(self, type, value, traceback):
print ('__exit__()')
def IspisiNesto(self):
print ('Nešto')
__init__()
__enter__()
Nešto
__exit__()
__del__()
• Primjer
class MyContext():
def __init__(self):
self.obj = None
def __enter__(self):
print ('Ulazak u context... ')
self.obj = 'Return object'
return self.obj
def __exit__(self, exc_type, exc_value, exc_traceback):
print('Izlazak iz context... ')
if exc_type:
print (f'Greška: {exc_type}, {exc_value}')
return False
Hvala na pozornosti!