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.

../_images/student_graph2.png

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