Abstraktsioon¶
Abstraktsioon (ingl k abstraction) on keerulise reaalse probleemi lihtsustamine modelleerides probleemile vastavaid klasse ning probleemile vastaval pärimisastmel.
Abstraktsiooni kasutatakse selleks, et peita funktsiooni sisemine funktsionaalsus kasutajate eest. Kasutajad suhtlevad funktsiooniga, kuid selle sisemine töö on peidetud - kasutaja teab, mida funktsioon teeb, kuid ei tea kuidas see toimib. Reaalelulise näitena saab tuua näiteks teleri puldi kasutamise: me kasutame nuppu „+“, et suurendada teleri helitugevust, kuid me ei tea kuidas see sisemiselt tegelikult toimub.
Pythonis kasutatakse abstraktsiooni programmi keerukuse vähendamiseks ning ebaoluliste andmete/klasside peitmiseks. Abstraktset baasklassi defineerides saab defineerida ühise rakendusprogrammi liidese (API ehk ingl k Application Program Interface) alamklasside jaoks. See on eriti kasulik nendes olukordades, kus kolmas osapool hakkab pakkuma rakendusi.
Vaikimisi ei paku Python abstraktseid klasse. Pythoniga on kaasas moodul ABC, mis annab baasi abstraktsete baasklasside defineerimiseks. Juhul kui defineeritakse alamklass baasklassist, pole meil vaja klassi eraldi registreerida.
Näide abstraktsioonist
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.
Ülaltoodud näites on näha, et meil on loodud abstraktne klass Animal
ning see on klasside Human
, Snake
, Dog
ning Lion
ülemklassiks. Abstraktsel klassil saavad olla nii abstraktsed kui ka mitteabstraktsed meetodid. Mitteabstraktne meetod on meie näites näiteks sleep()
ning meetod speak()
on abstraktne. See tähendab seda, et abstraktses baasklassis olev meetod sleep()
on sama kõikidele alamklassidele - seetõttu ei defineeri me seda abtraktse meetodina, et vältida koodi kordamist. Kuna meetod speak()
on kõikides alamklassides erinev, on see igas alamklassis eraldi defineeritud. Alamklasse initsialiseerides saame ligi nii abstraktsetele kui ka mitteabstraktsetele meetoditele.