9. OOP

  1. GITHUB: https://github.com/nikita-lit/BasicStructures/blob/master/OOP/main.py
  2. Mis on OOP?
  3. Mis on klass ja objekt?
  4. Konstruktor __init__
  5. Pärimine
  6. Kapseldamine
  7. Polümorfism
  8. Abstraktsioon
  9. Kokkuvõte:

GITHUB: https://github.com/nikita-lit/BasicStructures/blob/master/OOP/main.py

Mis on OOP?

Objektorienteeritud programmeerimine on programmeerimise paradigma, kus keskseks mõisteks on objektid — andmeüksused, mis ühendavad endas andmeid ja nende töötlemise meetodeid.

OOP võimaldab koodi paremat organiseerimist, modulaarset ülesehitust ning lihtsustab programmi hooldust ja laiendamist.

Mis on klass ja objekt?

Klass on kui objektide mall või plaan. See kirjeldab, milliseid omadusi (andmeliikmeid) ja käitumist (meetodeid) kõik selle klassi objektid omavad.

Objekt on klassi konkreetne eksemplar ehk tegelik andmeüksus, millel on oma olek ehk väärtused.

Näiteks:

class Opilane:
    def __init__(self, nimi, univ):
        self.nimi = nimi  # opilase nimi
        self.univ = univ  # univ

    def tutvustada(self):
        print(f"Minu nimi on {self.nimi} ja opin {self.univ} universiteedis.")

opilane1 = Opilane("Mari", "Tartu Univ")
opilane1.tutvustada()  # Minu nimi on Mari ja opin Tartu Universiteedis.

Konstruktor __init__

Konstruktor on eriline meetod, mis käivitatakse automaatselt objekti loomisel. Selle ülesandeks on initsialiseerida objekti omadused ehk anda neile algväärtused.

Pärimine

Pärimine võimaldab luua uusi klasse, mis põhinevad olemasolevatel klassidel. Alamklass pärib ülemklassilt kõik omadused ja meetodid ning võib neid laiendada või muuta. See vähendab koodi dubleerimist ja toetab paremat struktuuri.

class Lopetaja(Opilane):
    def __init__(self, nimi, univ, eriala):
        super().__init__(nimi, univ)  # Kutsume esivanema konstruktorit
        self.eriala = eriala  # Lopetaja eriala

    def tutvustada(self):
        print(f"Minu nimi on {self.nimi}, lopetasin {self.univ} universiidi ja minu eriala on {self.eriala}.")

lopetaja1 = Lopetaja("Jaan", "Tallinna Univ", "Arvutiteadus")
lopetaja1.tutvustada()  # Minu nimi on Jaan, lopetasin Tallinna Universiteedi ja minu eriala on Arvutiteadus.

Kapseldamine

Kapseldamise eesmärk on kaitsta andmeid ja peita nende siseolemus. Klass saab määrata, millised omadused ja meetodid on avalikud ja millised privaatsemad. Pythonis tähistatakse privaatseid muutujaid kahe alakriipsuga eesliites (__muutuja), et takistada nende otsest kasutamist klassiväliselt.

class Konto:
    def __init__(self, summa):
        self.__summa = summa  # privaatne muutuja

    def lisa_raha(self, summa):
        if summa > 0:
            self.__summa += summa

    def saada_summa(self):
        return self.__summa

konto = Konto(100)
konto.lisa_raha(50)
print(konto.saada_summa())  # 150

Privaatsete muutujate otsepöördumine ei tööta — see kaitseb andmeid tahtmatu muutmise eest.

Polümorfism

Polümorfism tähendab, et sama nimega meetod võib erinevates klassides käituda erinevalt. See võimaldab kasutada ühtset liidest erinevate objektide puhul.

class Kass:
    def heli(self):
        print("Mjau")

class Koer:
    def heli(self):
        print("Hau")

def vali_loom(loom):
    loom.heli()

kass = Kass()
koer = Koer()
vali_loom(kass)  # Mjau
vali_loom(koer)  # Hau

Selliselt saab funktsioone või meetodeid kirjutada nii, et nad töötavad erinevate klassidega, kui neil on samad meetodid.

Abstraktsioon

Abstraktsioon tähendab keeruliste süsteemide lihtsustamist, peites ebavajalikud detailid. Programmides tehakse abstraktsed klassid, mis defineerivad ainult liidese (meetodid, mida alamklassid peavad realiseerima), aga mitte nende sisu.

Pythonis saab abstraktseid klasse ja meetodeid luua mooduli abc abil.

from abc import ABC, abstractmethod

class Loom(ABC):
    @abstractmethod
    def heli(self):
        pass

class Lind(Loom):
    def heli(self):
        print("Säuts")

lind = Lind()
lind.heli()  # Säuts

Kui alamklass ei määra abstraktset meetodit, tekib viga.

Kokkuvõte:

OOP abil saad:

  • Jagada programmi väiksemateks osadeks (klassideks)
  • Luua objekte, millel on omad seisundid ja käitumine
  • Kasutada pärimist, et vältida koodi dubleerimist
  • Kaitsta andmeid kapseldamisega
  • Kirjutada paindlikku koodi polümorfismi kaudu
  • Lihtsustada keerukaid süsteeme abstraktsiooni abil

See lähenemine aitab hoida koodi loogiliselt organiseerituna ja võimaldab paremat koostööd ning laiendatavust.