Pärilikkus¶
Pärilikkus (ingl k inheritance) on ühe klassi võime tuletada või pärida omadused teiselt klassilt.
Pärilikkuse kasutamise eelised:
Pärilikkuse kasutamine tagab koodi taaskasutatavuse. Lisaks võimaldab see klassi lisada rohkem meetodeid ilma seda muutmata.
Pärilikkus on oma olemuselt transitiivne, mis tähendab et kui esimene klass pärib teisest klassist meetodid, siis kõik esimese klassi alamklassid pärivad samuti teise klassi meetodid.
Klassist on võimalik mõelda kui selliste objektide hulga kirjeldusest, millel on ühesugused omadused (näiteks nimi, pikkus jne) ja
tegevused/meetodid (näiteks haugu, istu jne). Klassi Dog
korral on hulgaks ühesuguste omadustega (mitte segamini ajada omaduste
väärtustega, mis võivad olla iga objekti puhul erinevad) ja tegevustega koerad, klassi Student
korral tudengid.
Pärilikkus esineb siis, kui meie hulk on teise hulga alamhulk.
Näiteks on hulk koer loomade hulga alamhulk.
Klasside puhul nimetatakse alamhulka iseloomustavat klassi alamklassiks.
Klassi, mida alamklass pärib, nimetatakse ülemklassiks ehk superklassiks.
Dog
on klassi Animal
alamklass ja klass Animal
on klassi Dog
superklass.
Praktikas tähendab pärilikkus, et kui meil on olemas ülem- ja alamklass ja ülemklassi sees on defineeritud mingisugused funktsioonid/muutujad, siis need on kättesaadavad ka alamklassile. Alamklassis saab lisaks defineerida ka uusi funktsioone.
Näide pärilikkusest
Olgu meil kaks klassi - Student
ja ITStudent
, viimane on klassi Student
alamklass
# Base or superclass
class Student:
def say_hello(self):
print("Hello!")
# Extending the base class
class ITStudent(Student):
def assist_friend(self):
print("Have you tried turning it off and on again?")
alice = Student()
mary = ITStudent()
alice.say_hello() # --> Hello!
mary.say_hello() # --> Hello!
alice.assist_friend() # --> AttributeError: 'Student' object has no attribute 'assist_friend'
mary.assist_friend() # --> Have you tried turning it off and on again?
Klass ITStudent
pärib Student
klassi funktsiooni say_hello
, ning defineerib lisaks assist_friend
funktsiooni.
ITStudent
isendile on mõlemad meetodid kättesaadavad, kuid Student
isendile ei ole assist_friend
meetod kättesaadav.
Pärilikkus Pythoni lähtekoodis
Pärilikkust kasutatakse näiteks erinevate erindite defineerimiseks.
Näiteks tekib erind (ingl k exception) TypeError
sellise koodi käivitamise tulemusena:
>>> 1 + "str"
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Vaadates pythoni lähtekoodi näeme, et TypeError
on Exception
klassi alamklass
(Lähtekoodi saab vaadata kirjutades PyCharmi TypeError
ja vajuta sinna peale hoides alla ctrl klahvi).
class TypeError(Exception):
""" Inappropriate argument type. """
def __init__(self, *args, **kwargs): # real signature unknown
pass
@staticmethod # known case of __new__
def __new__(*args, **kwargs): # real signature unknown
""" Create and return a new object. See help(type) for accurate signature. """
pass
Exception
ise on aga BaseException
klassi alamklass.
class Exception(BaseException):
""" Common base class for all non-exit exceptions. """
def __init__(self, *args, **kwargs): # real signature unknown
pass
@staticmethod # known case of __new__
def __new__(*args, **kwargs): # real signature unknown
""" Create and return a new object. See help(type) for accurate signature. """
pass
Erinditel on palju ühist koodi, mida jagada. Näiteks on kõikidel erinditel sõnum ja erindi tagasijälitus (traceback). Kuna iga erindi defineerimisel oleks traceback funktsiooni defineerimine ajakulukas, kasutatakse erindite puhul pärilikkust.
Lisalugemist
Koodinäiteid pärilikkuse kohta W3Schools Python inheritance peatükis.
Pärilikkuse põhimõtted ja kasutamine GeeksforGeeks Inheritance in Python artiklis.