OOP tehnikad
- Kapseldamine: See põhimõte seisneb funktsionaalsuse peitmises objekti sisse, piirates otsest ligipääsu selle sisemistele detailidele.
- Modulaarsus: Programm jagatakse iseseisvateks, eraldiseisvateks osadeks või mooduliteks, mis teevad koostööd.
- Polümorfism: See tähendab «mitut vormi» ja võimaldab alamklassidel vanemklassi meetodeid üle kirjutada, pakkudes spetsiifilist implementatsiooni.
- Pärimine: Mehhanism, mille abil üks klass (alamklass) saab pärida omadused ja meetodid teiselt klassilt (vanemklassilt).
OOP sissejuhatus
Objektorienteeritud programmeerimise juures on tavaline rääkida klasside kirjeldamisest ja nende kirjelduste alusel objektide loomisest ning manipuleerimisest. Objektidega manipuleerimine leiab aset klassi kirjelduses antud meetodite (põhimõtteliselt funktsioonide) alusel. Klassi kirjelduse alusel luuakse objekte, millistel on ühesugused omadused ja tegevused (meetodid).
Klassid
Klass on kasutaja määratletud andmestruktuur, mis seob andmeliikmed ja meetodid üheks üksuseks. Klass on objekti loomise plaan või koodimall. Klassi abil saate luua nii palju objekte kui soovite.
Klassil võib olla ka konstruktor, mis kujutab endast erilist, fikseeritud nimega, meetodit klassi sees.
Näide konstruktorist koodis:
class Dog:
# Class constructor
def __init__(self):
# Code here
Teeme nii, et meie konstruktor võtaks sisse teise argumendi, name, ja salvestaks selle uue muutuja self.name sisse.
class Dog:
# Class constructor
def __init__(self, name):
self.name = name
Konstruktorite tüübid
Pythonis on meil järgmised kolm tüüpi konstruktoreid:
- Vaikekonstruktor
- Parametriseerimata konstruktor
- Parameetriline konstruktor
Kui klassis konstruktorit ei määra, lisab Python vaikekonstruktori (ainus parameeter self). Parameetriline konstruktor (lisaparameetritega) võimaldab objektile loomisel edastada erinevaid algväärtusi.
Objektid
Objekt on klassi eksemplar. See on atribuutide (muutujate) ja meetodite kogum. Me kasutame toimingute tegemiseks klassi objekti.
Objekti loomise süntaks:
object_name = ClassName(argumendid))
Näide objekti loomise süntaksit kasutades:
dog_name = Dog("Snoopy", 3)
Igal objektil on järgmised omadused:
- Identiteet: iga objekt peab olema kordumatult identifitseeritud.
- Olek: objektil on atribuut, mis esindab objekti olekut ja see peegeldab ka objekti omadust.
- Käitumine: objektil on meetodid, mis esindavad tema käitumist
Pärimine
Objektide omadused paigutatakse hierarhiliselt:
- Ülemklass („superclass“) määratleb üldised omadused ja võib sisaldada abstraktseid atribuute/meetodeid (ilma rakenduseta).
- Alamklass („subclass“) pärib kõik ülemklassi omadused ning „extends“ neid, lisades spetsiifilisi atribuute või realiseerides abstraktsed meetodid.
- Abstraktseid omadusi/meetodeid saab kasutada, aga klassi instantsimine ebaõnnestub, kuni kõik need on alamklassides realiseeritud.
Kapseldamine
Kapseldamine (ingl encapsulation) eraldab klassi funktsionaalse sisu ja liidese.
Kapseldamise saavutamiseks kirjeldatakse, millised klassid võivad objekti liikmeid kasutada. Eesmärgiks on see, et selle liidese kliendid ei sõltuks realisatsiooni nendest osadest, mis võivad tulevikus muutuda. Muudatuste tegemine muutub aga lihtsamaks.
Kasutades Pythonis OOP-i põhimõtteid, saame piirata ligipääsu meetoditele ja muutujatele. Näiteks kui tahame teha privaatset muutujat price, saame seda teha, kasutades selleks _price või __price
Näiteks alljärgnev kood:
class Computer:
def __init__(self):
self.__sellingprice = 700
def sell(self):
print("Selling Price: {}".format(self.__sellingprice))
def set_selling_price(self, price):
self.__sellingprice = price
c = Computer()
c.sell()
# change the price
c.__sellingprice = 1000
c.sell()
# setting selling price using setter function
c.set_selling_price(1000)
c.sell()
Sellisel juhul on koodi käivitamise tulemuseks:Selling Price: 700
Selling Price: 700
Selling Price: 1000
Polümorfism
Polümorfism (ingl k polymorphism) on olukord, mille korral käitub meetod sõltuvalt klassist erinevalt.
Polümorfism esineb siis, kui alamklass kasutab superklassis defineeritud meetodit teisel moel ning mis teevad erinevat asja, siis on tegemist polümorfismiga.
Vaatame ka alljärgnevat koodinäidet:
class Circle:
def corners(self):
print("Circle doesn't have corners")
def sides(self):
print("Circle has one side")
class Rectangle:
def corners(self):
print("Rectangle has four corners")
def sides(self):
print("Rectangle has four sides")
# common interface
def corners_test(shape):
shape.corners()
# instantiate objects
first_shape = Circle()
second_shape = Rectangle()
# passing the object
corners_test(first_shape)
corners_test(second_shape)
Ülaltoodud koodi väljundiks tuleb:
Circle doesn't have corners
Rectangle has four corners
Abstraktsioon
Abstraktsioon on keerulise probleemi lihtsustamine, keskendudes olulisele ja peites ebaolulised detailid. Programmeerimises tähendab see funktsiooni või klassi sisemise töö varjamist kasutaja eest. Kasutaja teab, mida funktsioon teeb, aga mitte kuidas see toimib. Hea näide on teleripult: nupp «+» suurendab helitugevust, kuid me ei tea selle sisemist mehhanismi.
Pythonis aitab abstraktsioon vähendada programmi keerukust ja peita ebaolulisi andmeid. Abstraktseid baasklasse kasutades saab defineerida ühise liidese (API) alamklassidele. Python ise vaikimisi abstraktseid klasse ei paku, kuid ABC moodul võimaldab neid luua.
Vaatame näitena alljärgnevat koodi:
from abc import ABC
class Animal(ABC):
def sleep(self):
print("I am going to sleep.")
def speak(self):
pass
class Human(Animal):
def speak(self):
print("I can talk.")
class Snake(Animal):
def speak(self):
print("I can hiss.")
class Dog(Animal):
def speak(self):
print("I can bark.")
class Lion(Animal):
def speak(self):
print("I can roar.")
human = Human()
human.speak()
snake = Snake()
snake.speak()
dog = Dog()
dog.speak()
lion = Lion()
lion.speak()
Koodi käivitamise tulemus:
I can talk.I can hiss.I can bark.I can roar.
Ülesanne
