+ All Categories
Home > Documents > Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih...

Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih...

Date post: 19-Nov-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
60
Objekty IB111 Z´ aklady programov´ an´ ı Radek Pel´ anek 2018 1 / 59
Transcript
Page 1: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Objekty

IB111 Zaklady programovanıRadek Pelanek

2018

1 / 59

Page 2: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Rozcvicka

3

5

2

1

1

5

3

5

3

5

1

6

4

7

Resenım je identifikace mısta poblız Brna. Pokud je prave 6. 11. 2009, najdete na tomto mıste dalsı zpravu.

2 / 59

Page 3: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prace se soubory

strucny uvod pro potreby DU

Proc?

vstupnı data

ulozenı vystupu programu

zachovanı”stavu“ programu mezi jednotlivymi behy

vetsı projekty: databaze

3 / 59

Page 4: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prace se soubory

zakladnı postup:

otevrenı souboru

prace se souborem (ctenı / zapis)

zavrenı souboru

4 / 59

Page 5: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prace se soubory: otevrenı, uzavrenı

f = open(filename, mode)

jmeno souboru: retezec

zpusob otevrenı:

ctenı ("r")zapis ("w") – prepıse soubor, pokud nenı, vytvorı jejpridanı na konec ("a")dalsı moznosti: ctenı i zapis, binarnı rezim

uzavrenı: f.close()

5 / 59

Page 6: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prace se soubory: iterovanı po radcıch

for line in f.readlines():

print(line)

——

Alternativnı zpusob:

for line in f:

print(line)

vıce prıste

6 / 59

Page 7: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Objekty: Motivace

udrzovanı dat pohromade

zaznamy o knihach

nazev knihy, autor, ISBN, rok vydanı, . . .

postava v pocıtacove hre

souradnice (x, y), energie, vybavenı, . . .

7 / 59

Page 8: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Jak reprezentovat?

seznamy, n-tice

book = ["Godel, Escher, Bach: An Eternal Golden Braid",

"Douglas R. Hofstadter",

"978-0465026562",

1999]

print(book[0]) # title

print(book[1]) # author

nepojmenovane – nutno si pamatovat poradı polozek (v hlave,v komentarıch, v konstantach)

toto nenı pekne

8 / 59

Page 9: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Vyuzitı konstant

TITLE = 0

AUTHOR = 1

book = ["Godel, Escher, Bach: An Eternal Golden Braid",

"Douglas R. Hofstadter",

"978-0465026562",

1999]

print(book[TITLE])

print(book[AUTHOR])

lepsı jak predchozı, ale porad skarede

9 / 59

Page 10: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Jak reprezentovat?

slovnıky – pojmenovane polozky

book = {"title": "Godel, Escher, Bach: An Eternal Golden Braid",

"author": "Douglas R. Hofstadter",

"isbn": "978-0465026562",

"year": 1999}

print(book["title"])

print(book["author"])

toto nenı spatne, ale . . .

10 / 59

Page 11: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Motivace II

vlastnı datove typy: nejen data, ale i funkcionalita

schovavanı skaredych detailu

prıklad: dvojrozmerne matice z prednasky o datovych typech

pouzita reprezentace:

reprezentovany pomocı seznamu seznamunepekny zpusob zjist’ovanı velikosti matice

co bychom chteli?

spolu s maticı si udrzovat informace o jejı velikostimıt neco, co kontroluje prıstupy do matice

11 / 59

Page 12: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Motivace II

vlastnı datove typy: nejen data, ale i funkcionalita

schovavanı skaredych detailu

prıklad: dvojrozmerne matice z prednasky o datovych typech

pouzita reprezentace:

reprezentovany pomocı seznamu seznamunepekny zpusob zjist’ovanı velikosti matice

co bychom chteli?

spolu s maticı si udrzovat informace o jejı velikostimıt neco, co kontroluje prıstupy do matice

11 / 59

Page 13: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Motivace III

objektum se nelze vyhnout (v Pythonu a vetsine dalsıchjazyku)

zapis volanı funkcı pres operator”tecka“

retezce, seznamy, slovnıky, soubory, ...

12 / 59

Page 14: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Nezbytne vyuzitı objektu

t = "hello"

print(t.upper())

s = [7, 14, 42, 0]

s.sort()

s.append(9)

d = {"a": 1, "b": 2}

s = d.keys()

f = open("myfile.txt")

line = f.readline()

13 / 59

Page 15: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Slozene datove typy

Zaznamy, struktury

datovy typ slozeny z vıce polozek

typicky fixnı pocet polozek, deklarovane typy

C: struct

Pascal: record

Objekty

casto rozsırenı struktur

kombinujı data a funkce (metody)

C++, Java, Python: class

14 / 59

Page 16: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Objektove orientovane programovanı

Varovanı

Toto nenı objektove orientovane programovanı.

zde probırame zaklady vyuzitı objektu v Pythonu

primarne nahrada za zaznamy/strukturyjednoduche vyuzitı metod

”objektove orientovane programovanı“ je podstatne

slozitejsı

zapouzdrenı, verejne/soukrome atributydedicnostpolymorfismusmetodika navrhu programu

viz navazujıcı kurzy

15 / 59

Page 17: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Objekty v Pythonu

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

def say_hello(self):

print(self.name + " says hello.")

def rename_to(self, new_name):

print(self.name + " renamed to " + new_name + ".")

self.name = new_name

16 / 59

Page 18: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Slovnıcek pojmu

(zjednodusene)

trıda obecny uzivatelsky definovany typ, charakte-rizovan atributy

objekt konkretnı instance trıdy

atribut”to co je za teckou“, atributy jsou datove a

funkcnı

datovy atribut promenna patrıcı trıde/objektu (*)

metoda funkce, ktera je vazana na danou trıdu

konstruktor inicializacnı metoda, vytvarı objekt

(*) je rozdıl mezi atributem trıdy a objektu, vıce pozdeji

17 / 59

Page 19: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Pojmy – intuitivnı ilustrace

trıda: Pes

objekt (instance): Alık

datove atributy: rasa, jmeno, vek, poloha

metody: stekej, popobehni

18 / 59

Page 20: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Objekty v Pythonu

definice trıdy: class MyObject:

definice metod:def do something(self, parameter):

self – povinny prvnı parametrodkaz na aktualnı objektself nenı klıcovym slovem, jen silnou konvencı

objekty

instance trıdy, vlastnı atributyprıstup k atributum pomocı teckove notace

19 / 59

Page 21: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Vytvorenı objektu

specialnı metoda (konstruktor): __init__

predevsım inicializace atributu

——

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

vytvorenı objektu:

homer = Person("Homer Simpson", 34)

print(homer.name)

print(homer.age)

20 / 59

Page 22: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Metody: definice a pouzitı

teckova notace

objekt pred teckou se preda jako prvnı parametr (self)

——

class Person:

...

def say_hello(self):

print(self.name + " says hello.")

homer.say_hello()

# Homer Simpson says hello.

21 / 59

Page 23: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Metody a modifikace objektu

class Person:

...

def rename_to(self, new_name):

print(self.name + " renamed to " + new_name + ".")

self.name = new_name

homer.rename_to("Homer Jay Simpson")

# Homer Simpson renamed to Homer Jay Simpson.

print(homer.name)

# Homer Jay Simpson

22 / 59

Page 24: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prıstup k atributum

prımy:

pristupujeme prımo k atributu, muzeme i menithomer.name

neprımy:

pomocı metod (”getters and setters“)

get name, set name

Ktery zvolit?

zavisı na pouzitı

objekt jen pro drzenı dat: prımy prıstup je nejspıse OK

schovavame v objektu slozitejsı vnitrnosti: piste metody

23 / 59

Page 25: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

PEP8 konvence: nazvy

jmena trıd:CapWords (velka pocatecnı pısmena slov, bez oddelovacuslov)

atributy (datove, metody): stejne jako beznepromenne/funkcelowercase, lower case with underscores

24 / 59

Page 26: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prıklady

knihy

studenti

cas

matice

rodokmen

textove obrazky

25 / 59

Page 27: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prıklad: knihy

prace se seznamem knih

kniha ma: nazev, autora, ISBN

chceme seznam nacıtat/ukladat do souboru

26 / 59

Page 28: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Knihy

class Book:

def __init__(self, title, author, isbn):

self.title = title

self.author = author

self.isbn = isbn

geb = Book("Godel, Escher, Bach",

"Hofstadter",

"978-0465026562")

neverwhere = Book("Neverwhere",

"Gaiman",

"978-0380789016")

print(neverwhere.author)

27 / 59

Page 29: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Knihy: nacıtanı a ukladanı

def load_library(filename):

book_list = []

with open(filename, "r") as f:

for line in f:

a, t, i = line.split(";")

book_list.append(Book(t, a, i))

return book_list

def save_library(filename, book_list):

with open(filename, "w") as f:

for book in book_list:

f.write(book.title + ";" +

book.author + ";" +

book.isbn + "\n")

28 / 59

Page 30: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Knihy: pouzitı

save_library("library.csv", [geb, neverwhere])

books = load_library("library.csv")

for b in books: print(b.title)

vytvoreny / nacıtany soubor library.csv:

Godel, Escher, Bach;Hofstadter;978-0465026562

Neverwhere;Gaiman;978-0380789016

29 / 59

Page 31: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Reklamnı vstup

CSV jsou super, ty chcete!

CSV = Comma-separated values

format pro reprezentaci tabulkovych dat

jednoduchy textovy format, polozky oddeleny carkami(nebo necım podobnym)

vlastne ne uplne jednoduchy a pro realne aplikace chcete pouzıt knihovny jako je csv nebo pandas,

kazdopadne CSV jsou super, viz tez https://xkcd.com/1301/

30 / 59

Page 32: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prıklad: studenti a kurzy

reprezentace studentu a kurzu

kurz ma seznam zapsanych studentu

——

class Student:

def __init__(self, uco, name):

self.uco = uco

self.name = name

31 / 59

Page 33: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prıklad: studenti a kurzy

class Course:

def __init__(self, code):

self.code = code

self.students = []

def add_student(self, student):

self.students.append(student)

def print_students(self):

i = 1

for s in self.students:

print(str(i) + ".",

str(s.uco),

s.name, sep="\t")

i += 132 / 59

Page 34: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Studenti a kurzy: pouzitı

jimmy = Student(555007, "James Bond")

ib111 = Course("IB111")

ib111.add_student(Student(555000, "Luke Skywalker"))

ib111.add_student(jimmy)

ib111.add_student(Student(555555, "Bart Simpson"))

ib111.print_students()

# 1. 555000 Luke Skywalker

# 2. 555007 James Bond

# 3. 555555 Bart Simpson

33 / 59

Page 35: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Studenti a kurzy: razenı

Co kdyz chceme serazeny seznam studentu?

prirozene sorted(self.students) nefunguje – nenıdefinovano usporadanı na studentech

moznosti:

definovat usporadanı na studentech – metoda__lt__(self, other)

sorted(self.students, key=lambda s: s.name)

pouzıt pomocny seznam a ten seradit:tmp = [(s.name, s.uco) for s in

self.students]

co usporadanı abecedne podle prıjmenı?

34 / 59

Page 36: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Kahoot

35 / 59

Page 37: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Kahoot kod: otazky 2, 3, 4, 5

class Person:

def __init__(self, name):

self.name = name

self.best_friend = None

def set_friend(self, person):

self.best_friend = person

alice = Person("Alice")

bob = Person("Bob")

cyril = Person("Cyril")

alice.set_friend(bob)

bob.set_friend(cyril)

36 / 59

Page 38: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Python Tutor vizualizace

37 / 59

Page 39: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Kahoot kod: otazky 6, 7, 8, 9

class Point:

def __init__(self, x, y):

self.x = x

self.y = y

def shift(self, x, y):

self.x += x

self.y += y

a = Point(3, 2)

b = Point(1, 4)

points = [a, b, Point(0, 2)]

38 / 59

Page 40: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prıklad: reprezentace casu

(jednoducha naivnı verze, poradne: knihovna datetime)

class Time:

def __init__(self, h, m, s):

self.hours = h

self.minutes = m

self.seconds = s

self.validate()

def validate(self):

if self.seconds >= 60:

self.minutes += self.seconds // 60

self.seconds = self.seconds % 60

if self.minutes >= 60:

self.hours += self.minutes // 60

self.minutes = self.minutes % 60

39 / 59

Page 41: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Reprezentace casu

class Time: # ... continued ...

def add_seconds(self, sec):

self.seconds += sec

self.validate()

def pretty_print(self):

print("{}:{:02}:{:02}".format(self.hours,

self.minutes,

self.seconds))

t = Time(1, 30, 72)

t.pretty_print()

t.add_seconds(107)

t.pretty_print()

# 1:07:12

# 1:08:59

40 / 59

Page 42: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prıklad: matice

oproti drıvejsı ukazce prace s maticemi:

chceme uchovavat i jejich velikost

chceme bezpecny prıstup k prvkum

——

class Matrix:

def __init__(self, rows, cols):

self.rows = rows

self.cols = cols

self.matrix = [[0 for i in range(self.cols)]

for i in range(self.rows)]

41 / 59

Page 43: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Matice: metody

class Matrix: # ... continued ...

def check(self, row, col):

if row < 0 or row >= self.rows:

print("Bad row index.")

return False

if col < 0 or col >= self.cols:

print("Bad column index.")

return False

return True

def get(self, row, col):

if self.check(row, col):

return self.matrix[row][col]

def set(self, row, col, value):

if self.check(row, col):

self.matrix[row][col] = value 42 / 59

Page 44: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Matice: nasobenı

def matrix_mult(matL, matR):

if matL.cols != matR.rows:

print("Incompatible matrices.")

return

result = Matrix(matL.rows, matR.cols)

for i in range(matL.rows):

for j in range(matR.cols):

for k in range(matL.cols):

result.set(i, j, result.get(i, j) +

matL.get(i, k) *

matR.get(k, j))

return result

43 / 59

Page 45: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Matice: poznamky

ciste ilustrativnı prıklad

realnejsı verze by vyuzıvala:

pretızenı operatoru krat: mul

vyjimky, prıp. assert

. . . a nebo rovnou numpy

44 / 59

Page 46: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Prıklad: rodokmen

rozsırıme objekt pro osoby o rodicovske vztahy

pro jednoduchost jen jeden rodic

uvazujme jen zeny – Mater certa, pater incertus est.

rodokmen ∼ strom potomkyn

pro kazdou zenu si pamatujeme:

jmenomatkaseznam dcer

matka, seznam dcer – odkazy na objekty (abychom s nimimohli pracovat), nikoliv

”jmena“

45 / 59

Page 47: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

class Woman:

def __init__(self, name):

self.name = name

self.mother = None

self.daughters = []

def add_daughter(self, daughter):

self.daughters.append(daughter)

daughter.mother = self

alice = Woman("Alice")

mary = Woman("Mary")

lisa = Woman("Lisa")

carol = Woman("Carol")

alice.add_daughter(mary)

alice.add_daughter(lisa)

mary.add_daughter(carol)

46 / 59

Page 48: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Zakladnı pouzitı

print(carol.mother.name) # Mary

print(alice.mother.name) # error message

print(len(lisa.mother.daughters)) # 2

def siblings(a, b):

return a.mother != None and a.mother == b.mother

print(siblings(mary, alice)) # False

print(siblings(mary, lisa)) # True

47 / 59

Page 49: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Vypis rodokmenu

Chceme vypsat textove znazorneny rodokmen – odsazenıpodle generacı:

-----------------

Alice

Mary

Carol

Betty

Lisa

Maria

-----------------

Jak to udelat?

48 / 59

Page 50: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Vypis rodokmenu

Rekurze!

def draw_family_tree(woman, level=0):

print((" " * level) + woman.name)

for daughter in woman.daughters:

draw_family_tree(daughter, level + 1)

49 / 59

Page 51: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Rodokmen: nejstarsı predkyne

Rekurzivne:

def oldest_ancestor(woman):

if woman.mother == None:

return woman

return oldest_ancestor(woman.mother)

Iterativne:

def oldest_ancestor2(woman):

while woman.mother != None:

woman = woman.mother

return woman

50 / 59

Page 52: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Rodokmen: pocet potomkyn

Chceme vypocıtat pocet vsech potomkyn (i neprımych).

51 / 59

Page 53: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Rodokmen: pocet potomkyn

Chceme vypocıtat pocet vsech potomkyn (i neprımych).

rekurze s navratovou hodnotou:

funkce count offspring() vracı pocet potomkyn

hodnotu vypocıtame pomocı volanı count offspring()

na dcerach

52 / 59

Page 54: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Rodokmen: pocet potomkyn

def count_offspring(woman):

count = 0

for daughter in woman.daughters:

count += 1 + count_offspring(daughter)

return count

Pozn. count offspring by tez mohla byt metoda trıdy Woman

53 / 59

Page 55: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Textove obrazky

objekt reprezentujıcı obrazek

metody: pridej bod, pridej ctverec, zkombinuj s jinymobrazkem, . . .

”textove“ vykreslenı

⇒ demo ukazka programovanı

54 / 59

Page 56: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Varovanı: Staticke atributy

definovany prımo ve trıde

patrı samotne trıde, ne objektum

majı svuj smysl, ale v tuto chvıli spıse zdroj chyb

v tomto predmetu radeji nepouzıvejte

class MyClass:

x = 0

def __init__(self, n):

self.y = n

print(MyClass.x) # 0

my_object = MyClass(17)

print(my_object.y) # 17

print(my_object.x) # 0 (same as MyClass.x)

55 / 59

Page 57: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Staticke atributy: ilustrace problemu

class Person:

hobbies = []

def __init__(self, name):

self.name = name

def add_hobby(self, hobby):

self.hobbies.append(hobby)

mirek = Person("Mirek Dusin")

mirek.add_hobby("running")

mirek.add_hobby("world peace")

bidlo = Person("Dlouhe Bidlo")

bidlo.add_hobby("alcohol")

print(mirek.hobbies)

56 / 59

Page 58: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Python Tutor vizualizace

57 / 59

Page 59: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Varovanı: kopırovanı objektu

Co udela?

a = Matrix(2, 2)

a.set(0, 1, 6)

b = a

b.set(0, 0, 7)

print(a.matrix)

Vytvorenı aliasu, nikoliv kopırovanı (podobne jako u seznamu)!Jak kopırovat?

knihovna copy: copy (melka kopie), deepcopy (hlubokakopie)

vytvorit specialnı kopırovacı konstruktor

58 / 59

Page 60: Objektyxpelanek/IB111/slidy/objekty.pdfObjekty: Motivace udr zov an dat pohromad e z aznamy o knih ach n azev knihy, autor, ISBN, rok vyd an , ... postava v po c ta cov e h re sou

Shrnutı

Zaznamy/struktury

pouzıvame pro seskupenı souvisejıcıch dat

v Pythonu prımo nejsou

Objekty

slozitejsı nez zaznamy

data + metody

v tomto predmetu je pouzıvame primarne jako zaznamy sjednoduchymi metodami

vıce o objektove orientovanem programovanı (dedicnost,polymorfismus, objektovy navrh) v navazujıcıchpredmetech

59 / 59


Recommended