250 likes | 405 Views
Objektno orienitirano programiranje v Pythonu. Računalništvo Univerza v Ljubljani , FMF. Koncept. Program = zaporedje ukazov Problem – koda se začne ponavljati Rešitev : funkcije ( izognemo se ponavljanju identične kode ) – definicija na enem mestu , večkratna uporaba
E N D
Objektnoorienitiranoprogramiranje v Pythonu RačunalništvoUniverza v Ljubljani, FMF
Koncept • Program = zaporedjeukazov • Problem – koda se začneponavljati • Rešitev: funkcije (izognemo se ponavljanjuidentičnekode) – definicijanaenemmestu, večkratnauporaba • Objektnoorientiranoprogramiranjenamomogočapakiranjelogičnosorodnekode in podatkov v objekte in s tem olajšaupravljanjekode • Objekt = entiteta, kivsebujepodatke (atribute) in funkcije (metode)
Objekti • Objekti so podatkovno-funkcionalneenote, kizdružujejopodatke (atribute) in funkcije (metode) • Vsepodatkovneenote (karlahkoshranimo v spremenljivko) v Pythonu so objekti
Razredi • Vsakobjektimatip (t.j. je nekegarazreda) • Tip je razredobjekta, ki je določen z nekodefinicijo (oz. je vgrajen)
Definicijarazreda Imerazreda • Konstruktor: posebnametoda, ki se zaženeobgeneracijiobjekta (instance) razreda • V konstruktorjutipičnoinicializiramoatributerazreda konstruktor atribut metoda
Uporabaobjektov generiranje instance razreda (klickonstruktorja) dostop do atributov Imemetode je tudiatribut – vrneobjektdefinicijemetode Objektdefinicijemetode je “klicljiv” (callable). Klicizvedemetodoskladno z definicijo (namestoprvegaparametravstavikarsamobjekt (instanco).
Objektdefinicijerazreda • Ob naloženidefinicijirazreda se shrani pod imerazreda • Objekt je klicljiv – klicizvedekonstruktor in vrne novo instanco • Do metodlahkodostopamodirektnoprekoatributov, obnašajo se kotnavadnefunkcije
Pomenprvegaparametra • Imenipomembno – pomembno je prvomesto • Dogovor: prvi parameter vednoimenujemoself
Dodatno o razredih • Dokumentacijskiniz, takojnazačetku • Načelomalahkopoljubnakoda(nazačetkuali med definicijometod), ki se izvedeobnalaganjudefinicijerazreda • Podobnalogikakot v funkciji – različno le obravnavanjedefiniranihpodfunkcij, kiavtomatičnopostanejometode • “Lokalnespremenljivke” postanejoatributi v objektudefinicijerazreda
Dedovanje Nov razredprevzamevselastnostioriginalnega • Lahkoredefiniramokonstruktor, metode • Lahkododamonovemetode in noveatribute • Dedovanjenamprihraniponavljanjekode
Razred Vektor2D • Atributom, katerihimena se začnejo z podčrtajem, rečemoskritiatributi • Razvojnaorodja (IDLE) jihtipično ne prikazujejo • Dejansko so enakodostopnikotostaliatributi, čepoznamonjihovoime • Skrivanjetorejprekodogovoraboljoznačujenamen, kot pa da predstavljaorodjezaščite
Lastnosti • Obnašanjekotatributi, a dejansko so to funkcije • Uporabilismodekorator @property, kispremenifunkcijo norma2, preveže (naistoime) in dopolni, da dosežeciljnodelovanje • Primer uporabe: želimoimetimožnostaktivnostitakoprivračanjukotpripisanju v “navidezniatribut”
Lastnost x • Branje in nastavljanjestadejanskofunkciji, kjerlahkokajpostorimo, preverimo • Pomagamosi s pomočjofunkcije property
Lastnost y (z dekoratorji) • Enakučinekkotklicfunkcije property pri x (razendokumentacijskeganiza) • Dekorator @property je dejanskonaposebennačinnapisanafunkcija oz. razred property. Dekoracijajouporabizadopolnjevanjeoriginalnefunkcije y(), hkrati pa se izvedeprevezava in redefinicijalastnosti y, kiima pod metodo .setter spetrazred oz. funkcijo, s katero je mogočedekorirati • Dekoratorji so naposebennačinnapisanebodisifunkcijebodisirazredi • Mehanizemdefinicijerazredaobnalaganjujihznauporabiti
Metode s posebnimpomenom • Čenaobjektu o kličemofunkcijo abs(o), se dejanskoizvedemetodao.__abs__()
Posebnemetode: __repr__ • IDLE uporablja __repr__ zatekstovnoprezentacijo • Opomba: uporabaformatiranihnizov (metoda format nanizih) • Opomba: operator * pretvoriseznam v zaporedjeargumentov
Posebnemetode: __add__ • Kouporabimo operator seštevanje, npr. a + b, se dejanskoizvedemetodaa.__add__(b) • Podobnoveljazadrugeoperatorje (__sub__, __mul__, …)
Posebnemetode: __ • Operator oglatioklepaj (funkcija, ki se zgodiobbranju) • Obstajatudi __setitem__
Razredmatrika • Tudifunkcionalnostfunkcijskegaklicalahkodefiniramo s pomočjometode __call__
Izjeme • Ko se zgodikajnenavadnega, npr. deljenje z 0, Python generiraizjeme • Izjeme so spetobjekti • Lahkojihulovimo, lahkojihsamiizvržemo • Lahkodefiniramotudisvojerazrede, kijihuporabimokotizjeme
Primer: Razredvektor 2D • Pisanje v lastnost x kličemetodonastaviX(…), kipreveri tip podatkazavpis in vržeizjemo Exception(), čevpisniustreznegatipa
Lastneizjeme • Definicijalastneizjeme (dedičrazreda Exception) • Popravekmetode __getitem__ v razreduvektor
Lovljenjeizjem • Uporabimozanko try … except
Načinilovljenjaizjem Oglejmosi primer.