Objekt orienteeritud programmeerimine (OOP)

Objekt

Python

  • Objekt kirjeldab ära konkreetse loogilise kogumi
    • näiteks õues olev punane auto on üks objekt
    • selle taga olev roheline auto on teine objekt jne
  • Tavaliselt mõtleme me arvust kui ühest väärtusest
  • Objekt koosneb tavaliselt mitmest väärtusest
    • värv, mark, mudel, pikkus, registrimass jne.

Klass

  • Klass kirjeldab ära struktuuri
    • näiteks autol on värv, pikkus jne
  • Klass (üldiselt) ei sisalda andmeid
  • Klass on andmetüüp
  • Samatüüpi andmed pärinevad kõik ühest klassist
    • punane auto on auto, roheline auto on auto jne
  • Kuigi meil on maailmas mitu autot (objekti), siis meil on üks klass auto

OOP

  • Objekt-orienteeritud programmeerimine (OOP) on prgrammeerimise paradigma, mis kasutab objekte
  • Python on objekti-orienteeritud programmeerimiskeel (OOP)
  • Pythonis kõik asjad on objektid

OOP Tehnikad

  • Kapseldamine (encapsulation)
    • funktsionaalsus peidetakse
  • Modulaarsus (modularity)
    • programm jagatakse iseseisvateks tükkideks
  • Polümorfism (Polymorfism)
    • alamklass saab meetodeid üle kirjutada
  • Pärimine (inheritance)
    • alamklass pärib omadused ja meetodid

Sõne

  • Sõne on objekt
  • Kui loote uue sõne, siis tegelikult luuakse uus objekt, mille tüüp on str
  • Sõne “funktsioone” kutsutakse meetoditeks
    • ehk siis klassis kirjeldatud funktsioonid on meetodid
s = "Hello"
print(type(s)) # <class 'str' >
print(id(s)) # 30773472
print(id(s.replace("H", "h"))) # 61507648
  • Loome sõne s ja küsime selle tüübi. Tüüp on str klass
  • id tagastab objekti kohta unikaalse arvu. Kui id on erinev, siis on ka objekt erinev (st mälus erinevas kohas)
  • replace teeb uue sõne, seda näeme ka id-ga
  • replace on sõne meetod ehk funktsioon, mida saab välja kutsuda objektil

List

a = [1, 2, 3]
b = [1, 2, 3]
c = b
print(id(a)) # 44058024
a.append(4)
print(id(a)) # 44058024 - still as b 
print(id(b)) # 44059184
print(id(c)) # 44059184 - still as b
b.pop()
print(id(b)) #44059184 - still the same
print(id(c)) # 44059184 - and same
  • Listi muutes id ei muutu
  • c ja b viitavad saamule listile

Veel objekte

print(type(1))     # <class 'int'>
print(type(True))  # <class 'bool'>
print(type(1.2))   # <class 'float'>
print(type(None))  # <class 'NoneType'>
print(type(len))   # <class 'builtin_function_or_method'>
print(type(type))  # <class 'type'>

Klass kui andmetüüp

  • Iga klass on andmetüüp
  • Näiteks on Pythonis klass str
  • Iga konkreetne sõne, näiteks “Tere”, on selle klassi objekti (ehk isend)
  • Ühest klassist saab luua lõpmata palju objekte
  • Objekti kohta öeldakse ka isend ja instants
    • Üldiselt mõeldakse “objekt”, “isend”, “instants” terminitega samu asju
    • Erinevates allikates võivad neil erinevused olla

Teeme oma klassi

class Student:
    pass
s = Student()
print(type(s))  # <class '__main__.Student'>
print(id(s))    # 12448112
t = Student()
print(type(t))  # <class '__main__.Student'>
print(id(t))    # 12423408
  • Klass Student. pass on tühi korraldus
  • Loome kaks isendit – nende id on erinev (nad on mälus erinevas kohas)

Objektide võrdlemine

  • Objektide võrdlemine == võrdlusega kontrollib vaikimisi seda, kas nad viitavad samale objektile
  • Seda, mida täpselt kontrollitakse, saab üle kirjutada
    • Näiteks sõne puhul kontrollitakse seda, kas sisu (st sümbolid) on samad jne
s1 = Student()
s2 = Student()
s3 = s1
print(s1 == s2)   # False
print(s1 == s3)   # True
print(s2 == s3)   # False

Meetod

  • Klassis sisalduvaid funktsioone nimetatakse meetoditeks
class Student:
    """Student class."""
    def hello(self):  # method, "self" is a special parameter
        """Method (function) which just prints out "Hello!"."""
        print("Hello!")
s = Student()   # s is an object of class Student
s.hello()       # no "self" argument

Self

  • Kõik objekti meetodid sisaldavad esimest parameetrit self
    • selle parameetri nimi võib ka midagi muud olla; kasutage self
  • self viitab isendile
  • Eelmises näites oli väljakutse s.hello()
    • kui hello() meetod käima pannakse, antakse sellele s kaasa
  • Meetodi jaoks vajalike väärtuste jaoks lisatakse need peale self parameetrit