Posted in

OOP

OOP-tehnikad

  • Inkapsulatsioon: Funktsionaalsus peidetakse objekti sisse, piirates otsest ligipääsu selle sisemistele detailidele.
  • Modulaarsus: Programm jagatakse sõltumatuteks mooduliteks, mis töötavad koos.
  • Polümorfism: „Mitu vormi“ – võimaldab alamklassidel muuta vanemklassi meetodite käitumist.
  • Pärilikkus: Üks klass (alamklass) saab pärida teiselt klassilt (vanemklassilt) omadusi ja meetodeid.

Sissejuhatus OOP-sse

Objektorienteeritud programmeerimises räägitakse klasside kirjeldamisest ja objektide loomisest nende kirjelduste alusel. Objektide käsitlemine toimub klassis määratletud meetodite kaudu (meetodid on põhimõtteliselt funktsioonid).


Klassid

Klass on kasutaja määratud andmestruktuur, mis seob andmeväljad (muutujad) ja meetodid ühtsesse tervikusse. Klass on nagu plaan, mille järgi saab luua piiramatult objekte.

Näide konstruktorist:

class Dog:
    # Klassikonstruktor
    def __init__(self, name):
        self.name = name


Konstruktorite tüübid Pythonis

  1. Vaikekonstruktor – kui konstruktorit ei määrata, loob Python selle automaatselt (__init__(self)).
  2. Mitteparametriseeritud konstruktor – ei võta lisaparameetreid.
  3. Parametriseeritud konstruktor – võtab vastu parameetreid ja võimaldab erinevaid algväärtusi.

Objektid

Objekt on klassi eksemplar ehk tegelik näide. See sisaldab atribuute (muutujaid) ja meetodeid.

Objekti loomise süntaks:

dog_name = Dog("Snoopy")

Objekti omadused:

  • Identiteet – igal objektil on ainulaadne ID.
  • Seisund – määratud atribuudi(te) väärtustega.
  • Käitumine – määratud meetoditega.

Pärilikkus

Omadused jaotatakse hierarhiliselt:

  • Vanemklass – sisaldab üldiseid omadusi ja võib sisaldada abstraktseid meetodeid.
  • Alamklass – pärib omadused ja laiendab neid.

Abstraktseid meetodeid ei saa kasutada enne, kui need on alamklassides implementeeritud.


Inkapsulatsioon

Inkapsulatsioon eraldab klassi sisemise toimimise selle liidesest (interface). See aitab hoida koodi stabiilsena, isegi kui sisemine toimimine muutub.

Näide inkapsulatsioonist ja privaatsetest muutujatest:

class Computer:

    def __init__(self):
        self.__sellingprice = 700  # privaatne muutuja

    def sell(self):
        print("Müügihind: {}".format(self.__sellingprice))

    def set_selling_price(self, price):
        self.__sellingprice = price

c = Computer()
c.sell()

# Püüame muuta hind otse
c.__sellingprice = 1000
c.sell()

# Muudame hind setter-meetodiga
c.set_selling_price(1000)
c.sell()

Väljund:

Müügihind: 700  
Müügihind: 700  
Müügihind: 1000

Polümorfism

Polümorfism tähendab, et sama meetod käitub erinevates klassides erinevalt.

Näide:

class Circle:

    def corners(self):
        print("Ringil pole nurki")

    def sides(self):
        print("Ringil on üks külg")

class Rectangle:

    def corners(self):
        print("Ristkülikul on neli nurka")

    def sides(self):
        print("Ristkülikul on neli külge")

# Ühine liides
def corners_test(shape):
    shape.corners()

# Objektide loomine
first_shape = Circle()
second_shape = Rectangle()

# Meetodi käivitamine
corners_test(first_shape)
corners_test(second_shape)

Väljund:

Ringil pole nurki  
Ristkülikul on neli nurka

Abstraktsioon

Abstraktsioon tähendab keskendumist olulisele ja ebaolulise peitmist. Kasutaja teab, mida funktsioon teeb, aga mitte kuidas see töötab.

Pythoni moodul abc (Abstract Base Class) võimaldab luua abstraktseid klasse.

Näide abstraktsioonist:

from abc import ABC

class Animal(ABC):

    def sleep(self):
        print("Ma lähen magama.")

    def speak(self):
        pass  # abstraktne meetod

class Human(Animal):

    def speak(self):
        print("Ma oskan rääkida.")

class Snake(Animal):

    def speak(self):
        print("Ma oskan sisiseda.")

class Dog(Animal):

    def speak(self):
        print("Ma oskan haukuda.")

class Lion(Animal):

    def speak(self):
        print("Ma oskan möirgata.")

# Objektide loomine ja meetodi kutsumine
human = Human()
human.speak()

snake = Snake()
snake.speak()

dog = Dog()
dog.speak()

lion = Lion()
lion.speak()

Väljund:

Ma oskan rääkida.  
Ma oskan sisiseda.  
Ma oskan haukuda.  
Ma oskan möirgata.

Lisa kommentaar

Sinu e-postiaadressi ei avaldata. Nõutavad väljad on tähistatud *-ga