Programowanie obiektowe

Transkrypt

Programowanie obiektowe
Programowanie obiektowe
Wykład 3
Piotr Błaszyński
Wydział Informatyki Zachodniopomorskiego Uniwersytetu Technologicznego
2 lutego 2017
Agregacja
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
zawieranie się, gromadzenie elementów – nowa klasa
powstaje przez użycie obiektów klas już istniejących,
klasa może być zbudowana z dowolnej liczby obiektów
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
obiekty te mogą być dowolnych typów (również kolekcje)
często mówimy o relacji zawierania np. ”ciało zawiera
rękę” - gdzie Ręka i Ciało są klasami, oraz klasa Ciało
zawiera w sobie obiekt (a w zasadzie 2 obiekty) typu Ręka.
Agregacja nie tworzy klasy pochodnej, lecz zupełnie nowy
typ.
Agregacja - prosty przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
class Reka :
def
init
( self , ktora ) :
s e l f . ktora = ktora
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
class Noga :
def
init
( self , ktora ) :
s e l f . ktora = ktora
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
class C i a l o S a mo :
def
init
( self ) :
s e l f . l e w a r e k a = Reka ( " LEWA " )
s e l f . p r a w a r e k a = Reka ( " PRAWA " )
s e l f . l e w a n o g a = Noga ( " LEWA " )
s e l f . p r a w a n o g a = Noga ( " PRAWA " )
x = CialoSamo ( )
Agregacja - prosty przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
class Reka :
def
init
( self , ktora ) :
s e l f . ktora = ktora
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
class Noga :
def
init
( self , ktora ) :
s e l f . ktora = ktora
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
class C i a l o :
def
init
( s e l f , lewa reka , prawa reka ,
lewa noga , prawa noga ) :
s e l f . lewa reka = lewa reka
s e l f . prawa reka = prawa reka
s e l f . lewa noga = lewa noga
s e l f . prawa noga = prawa noga
cdn.
Agregacja - prosty przykład cd.
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
moja
moja
moja
moja
l e w a r e k a = Reka ( " LEWA " )
p r a w a r e k a = Reka ( " PRAWA " )
l e w a n o g a = Noga ( " LEWA " )
p r a w a n o g a = Noga ( " PRAWA " )
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
x= C i a l o ( m o j a l e w a r e k a , m o j a p r a w a r e k a ,
moja lewa noga , moja prawa noga )
Agregacja - bardziej realny przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
class Punkt :
def
init
( self , x , y) :
self .x = x
self .y = y
def pok az ( s e l f ) :
print ( "X: " + str ( s e l f . x ) + "
self . y))
Y :" + str (
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
class O d c i n e k :
def
init
( s e l f , punkt poczatkowy ,
punkt koncowy ) :
s e l f . punkt poczatkowy = punkt poczatkowy
s e l f . punkt koncowy = punkt koncowy
def pok az ( s e l f ) :
print ( " Punkt poczatkowy :" , end = ’ ’ )
s e l f . p u n k t p o c z a t k o w y . pokaz ( )
print ( " Punkt koncowy :" , end = ’ ’ )
s e l f . p u n k t k o n c o w y . pokaz ( )
Agregacja - bardziej realny przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Tworzenie obiektów, obiekty nazwane jako parametry,
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
p o c z a t e k = Punkt ( 1 0 , 1 5 )
k o n i e c = Punkt ( 2 0 , 3 5 )
odcinek = Odcinek ( poczatek , k o n i e c )
o d c i n e k . po kaz ( )
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Wynik:
Punkt p o c z a t k o w y : X : 10 Y : 1 5
Punkt koncowy : X : 20 Y : 3 5
Agregacja - bardziej realny przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Tworzenie obiektów, obiekty jako parametry tworzone w trakcie
konstruowania agregatu:,
o d c i n e k = O d c i n e k ( Punkt ( 1 0 , 1 5 ) , Punkt ( 2 0 , 3 5 ) )
o d c i n e k . po kaz ( )
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Wynik:
Punkt p o c z a t k o w y : X : 10 Y : 1 5
Punkt koncowy : X : 20 Y : 3 5
Kompozycja
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Główna różnica polega na tym, że obiekty należące do
obiektu agregującego nie mogą istnieć (nie ma sensu ich
istnienie) poza obiektem grupującym.
różnica jest niezbyt istotna
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
w poprzednich przykładach możemy mówić o kompozycji
(ang. composition) o ile Ręki czy Punktu nie używamy na
zewnątrz,
jeżeli obiekty składowe nie są tworzone na zewnątrz klasy
to klasy dla tych obiektów można zapisać wewnątrz
metody klasy agregującej (np. w init ) lub w samej
klasie.
Kompozycja - przykład
Programowanie
obiektowe
Definicja klas w klasie, trzeba się odpowiednio odwoływać:
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
class C i a l o S a mo :
class Reka :
def
init
( self , ktora ) :
s e l f . ktora = ktora
class Noga :
def
init
( self , ktora ) :
s e l f . ktora = ktora
def
init
( self ) :
s e l f . l e w a r e k a = CialoSamo . Reka ( " LEWA " )
s e l f . p r a w a r e k a = CialoSamo . Reka ( " PRAWA " )
s e l f . l e w a n o g a = CialoSamo . Noga ( " LEWA " )
s e l f . p r a w a n o g a = CialoSamo . Noga ( " PRAWA " )
Czemu testować
x = CialoSamo ( )
Kompozycja - przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Definicja klas w metodzie, krótszy zapis, przy większych
przypadkach może być jednak mało czytelne:
class C i a l o S a mo :
def
init
( self ) :
class Reka :
def
init
( self , ktora ) :
s e l f . ktora = ktora
class Noga :
def
init
( self , ktora ) :
s e l f . ktora = ktora
s e l f . l e w a r e k a = Reka ( " LEWA " )
s e l f . p r a w a r e k a = Reka ( " PRAWA " )
s e l f . l e w a n o g a = Noga ( " LEWA " )
s e l f . p r a w a n o g a = Noga ( " PRAWA " )
x = CialoSamo ( )
Moduły
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
Większy program można (od pewnego momentu wręcz należy)
podzielić na moduły:
w module możemy umieścić pojedynczą klasę lub funkcję,
możemy również umieszczać wiele klas i funkcji,
podstawowywm kryterium podziału powinna być jego
logika
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
np. nie łączymy funkcji geometrycznych do rysowania figur
z klasami do zarządzania osobami
np. klasę bazową można umieszczać wspólnie z jej klasami
pochodnymi,
nazwy modułów powinny być raczej krótkie, zgodne z
zawartością.
Moduły - przykłady
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Plik osobaModule.py - jedna klasa w module
class Osoba :
def
init
( s e l f , imie , nazwisko ) :
s e l f . imie = imie
s e l f . nazwisko = nazwisko
def pok az ( s e l f ) :
print ( s e l f . i m i e + ’ ’ + s e l f . n a z w i s k o )
Moduły - przykłady
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Plik osobaModule.py - jedna klasa w module
>>> import OsobaModule
T r a c e b a c k ( most r e c e n t c a l l l a s t ) :
F i l e " < pyshell #0 > " , l i n e 1 , in <module>
import OsobaModule
I m p o r t E r r o r : No module named ’ OsobaModule ’
Serializacja
pikle
Wzorce
projektowe
>>> import osobaModule
Wzorzec Iterator
Testowanie
przy OOP
>>> from osobaModule
SyntaxError : i n v a l i d syntax
Czemu testować
Czemu testować
>>> from osobaModule import Osoba
Moduły - przykłady
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Plik osobaModule.py - jedna klasa w module
>>> import osobaModule
>>> x = Osoba ( " Jan " , " Nowak " )
T r a c e b a c k ( most r e c e n t c a l l l a s t ) :
F i l e " < pyshell #7 > " , l i n e 1 , in <module>
x = Osoba ( " Jan " , " Nowak " )
NameError : name ’ Osoba ’ is not d e f i n e d
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
>>>
>>>
>>>
Jan
import osobaModule
x = osobaModule . Osoba ( " Jan " , " Nowak " )
x . pok az ( )
Nowak
Czemu testować
Czemu testować
>>> from osobaModule import Osoba
>>> x = osobaModule . Osoba ( " Jan " , " Nowak " )
T r a c e b a c k ( most r e c e n t c a l l l a s t ) :
F i l e " < pyshell #1 > " , l i n e 1 , in <module>
Moduły - przykłady
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Plik osobaModule.py - jedna klasa w module
Kompozycja
Pakiety i
moduły
Moduły
>>> from osobaModule import Osoba
x = osobaModule . Osoba ( " Jan " , " Nowak " )
NameError : name ’ osobaModule ’ is not d e f i n e d
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
>>>
>>>
>>>
Jan
>>>
from osobaModule import Osoba
x = Osoba ( " Jan " , " Nowak " )
x . pok az ( )
Nowak
Moduły - przykłady
Programowanie
obiektowe
Plik osobaModule.py - jedna klasa w module
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
>>> from osobaModule import ∗
>>> x = osobaModule . Osoba ( " Jan " , " Nowak " )
T r a c e b a c k ( most r e c e n t c a l l l a s t ) :
F i l e " < pyshell #6 > " , l i n e 1 , in <module>
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
>>> from osobaModule import ∗
x = osobaModule . Osoba ( " Jan " , " Nowak " )
NameError : name ’ osobaModule ’ is not d e f i n e d
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
>>>
>>>
>>>
Jan
from osobaModule import ∗
x = Osoba ( " Jan " , " Nowak " )
x . pok az ( )
Nowak
Moduły - przykłady
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
Plik osobaModule.py - dwie klasy w module
class Osoba :
def
init
( s e l f , imie , nazwisko ) :
s e l f . imie = imie
s e l f . nazwisko = nazwisko
def pok az ( s e l f ) :
print ( s e l f . i m i e + ’ ’ + s e l f . n a z w i s k o )
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
class S t u d e n t ( Osoba ) :
def
init
( s e l f , imie , nazwisko , n r i n d e k s u ) :
super ( ) .
init
( imie , nazwisko )
s e l f . nr indeksu = nr indeksu
Czemu testować
Czemu testować
def pok az ( s e l f ) :
super ( ) . pokaz ( )
print ( s e l f . n r i n d e k s u )
Moduły - przykłady
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Plik osobaModule.py - dwie klasy w module
>>> from osobaModule import Osoba , S t u d e n t
>>> x=S t u d e n t ( " Jan " , " Nowak " , 1 2 3 4 )
>>> x . pok az ( )
Jan Nowak
1234
Moduły - przykłady
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Plik osobaModule.py - dwie klasy w module, inne zachowanie
niż w niektórych językach.
>>> from osobaModule import S t u d e n t
>>> x = S t u d e n t ( " Jan " , " Nowak " , 1 2 3 4 )
>>> z = Osoba ( " Andrzej " , " Kowalski " )
T r a c e b a c k ( most r e c e n t c a l l l a s t ) :
F i l e " < pyshell #2 > " , l i n e 1 , in <module>
z = Osoba ( " Andrzej " , " Kowalski " )
NameError : name ’ Osoba ’ is not d e f i n e d
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
>>> from osobaModule import S t u d e n t
>>> x = S t u d e n t ( " Jan " , " Nowak " , 1 2 3 4 )
>>> x . pok az ( )
Jan Nowak
1234
Moduły - korzystanie
Programowanie
obiektowe
Agregacja,
kompozycja
Możliwość lokalnego korzystania z innej nazwy dla
importowaneego modułu lub klasy:
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
import nazwa modulu a s l o k a l n a n a z w a m o d u l u
from nazwa modulu import n a z w a k l a s y a s
lokalna nazwa klasy
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Dla klasy:
>>> from osobaModule import Osoba a s P e r s o n
>>> x=P e r s o n ( " Andrzej " , " Abacki " )
>>> x
<osobaModule . Osoba object a t 0 x029FDE90>
>>> x .
dict
{ ’ imie ’ : ’ Andrzej ’ , ’ nazwisko ’ : ’ Abacki ’}
Moduły - korzystanie
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Możliwość lokalnego korzystania z innej nazwy dla
importowaneego modułu lub klasy:
import nazwa modulu a s l o k a l n a n a z w a m o d u l u
from nazwa modulu import n a z w a k l a s y a s
lokalna nazwa klasy
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Dla modułu:
>>> import osobaModule a s omod
>>> x=omod . Osoba ( " Andrzej " , " Abacki " )
>>> x
<osobaModule . Osoba object a t 0 x0278FDF0>
Pakiety
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Do grupowania modułów
tak naprawdę kolejny poziom grupowania (abstrakcji),
moduły też można zagnieżdżać,
Pakiet może zawierać jeden moduł,
Pakiety
Serializacja
pikle
Wzorce
projektowe
ale raczej powinien zawierać pewien zbiór modułów i
innych rzeczy,
Pakiet to kolekcja modułów w katalogu,
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
nazwa pakietu to nazwa tego katalogu,
żeby można było importować moduły z pakietu, trzeba w
nim umieścić (wystarczy pusty) plik init .py
Pakiety - przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Pakiet o nazwie obiekty:
obiekty
|
C i a l o . py
|
C i a l o S a m o . py
|
init
. py
|
+−−−g e o m e t r i a
|
Punkty . py
|
init
. py
|
\−−−o s o b y
osobaModule . py
init
. py
Czemu testować
Czemu testować
Ciekawostka, powyższe uzyskać można poleceniem DOS:
t r e e o b i e k t y /A /F
Pakiety - importowanie
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Z zewnątrz pakietu (bezwględny):
Kompozycja
Pakiety i
moduły
import n a z w a p a k i e t u . nazwa modulu
x = n a z w a p a k i e t u . nazwa modulu . NazwaKlasy ( )
Moduły
Pakiety
Serializacja
pikle
from n a z w a p a k i e t u . nazwa modulu import NazwaKlasy
x = NazwaKlasy ( )
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
from n a z w a p a k i e t u import nazwa modulu
x = nazwa modulu . NazwaKlasy ( )
Pakiety - importowanie
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
Źle:
>>> from o b i e k t y import CialoSamo
>>> x=C i a l o S amo ( )
T r a c e b a c k ( most r e c e n t c a l l l a s t ) :
F i l e " < pyshell #24 > " , l i n e 1 , in <module>
x=C i a l o S amo ( )
T y p e E r r o r : ’ module ’ object is not callable
pikle
Wzorce
projektowe
Dobrze:
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
>>> from o b i e k t y . CialoSamo import CialoSamo
>>> x=C i a l o S amo ( )
>>> x
<o b i e k t y . C i a l oSamo . CialoSamo object a t 0x02A10CB0>
Pakiety - importowanie
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Dobrze, ale trochę dużo pisania:
from o b i e k t y . g e o m e t r i a . Punkty import Odcinek , Punkt
>>> o d c i n e k = O d c i n e k ( Punkt ( 1 0 , 1 5 ) , Punkt ( 2 0 , 3 5 ) )
>>> o d c i n e k . pokaz ( )
Punkt p o c z a t k o w y : X : 10 Y : 1 5
Punkt koncowy : X : 20 Y : 3 5
<o b i e k t y . C i a l oSamo . CialoSamo object a t 0 x026199F0>
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Skąd ten obiekt na końcu?
Pakiety - importowanie
Programowanie
obiektowe
Agregacja,
kompozycja
Z wnętrza pakietu (wględny). Z pakietu z tego samego katalogu
Agregacja
Kompozycja
Pakiety i
moduły
from . nazwa modulu import NazwaKlasy
x = NazwaKlasy ( )
Moduły
Pakiety
Z pakietu z katalogu wyżej (z pakietu nadrzędnego):
Serializacja
pikle
Wzorce
projektowe
from . . nazwa modulu import NazwaKlasy
x = NazwaKlasy ( )
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
from . . n a z w a p a k i e t u . nazwa modulu import NazwaKlasy
x = NazwaKlasy ( )
Pakiety - importowanie
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Jesteśmy w pliku osobaModule.py Dobrze:
from . osobaModule import Osoba
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Jesteśmy w pliku Punkty.py
from . . C i a l oS am o import CialoSamo
Zapis obiektów do pliku
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Python oferuje moduł pickle
Skojarzenie ze słoikiem ogórków prawidłowe.
pickle zamienia obiekt i wszystkie obiekty będące jego
atrybutami w ciąg bajtów
może być on przechowany,
lub przesłany.
Serializacja - przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
class C i a l o S a mo :
class Reka :
def
init
( self , ktora ) :
s e l f . ktora = ktora
class Noga :
def
init
( self , ktora ) :
s e l f . ktora = ktora
def
init
( self ) :
s e l f . l e w a r e k a = CialoSamo . Reka ( " LEWA " )
s e l f . p r a w a r e k a = CialoSamo . Reka ( " PRAWA " )
s e l f . l e w a n o g a = CialoSamo . Noga ( " LEWA " )
s e l f . p r a w a n o g a = CialoSamo . Noga ( " PRAWA " )
Czemu testować
cdn.
Serializacja - przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Przy okazji dobry sposób na współpracę z plikiem:
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
x = CialoSamo ( )
import p i c k l e
w i t h open ( " cialo . bin " , ’wb ’ ) a s file :
p i c k l e . dump ( x , file )
w i t h open ( " cialo . bin " , ’rb ’ ) a s file :
z = p i c k l e . l o a d ( file )
print ( z . l e w a r e k a . k t o r a )
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Wynik (zapisaliśmy obiekt x do pliku i wczytaliśmy go jako z):
LEWA
Serializacja - przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Wersja z przesyłaniem ciągu bajtów:
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
x = CialoSamo ( )
import p i c k l e
z r z u t b a j t o w y = p i c k l e . dumps ( x )
y = pickle . loads ( zrzut bajtowy )
print ( y . l e w a r e k a . k t o r a )
Wynik (zapisaliśmy obiekt x do ciągu bajtów i zamieniliśmy go
(ciąg bajtów) na y):
LEWA
Wzorce projektowe
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Wiele problemów ma już gotowe rozwiązania,
Często nasz problem jest podobny, można go podobnie
rozwiązać jak problem rozwiązany przez kogoś innego
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
Każdy wzorzec projektowy proponuje zestaw obiektów
oddziałujących w specyficzny sposób w celu rozwiązania
ogólnego problemu.
Wzorzec Iterator
Programowanie
obiektowe
Agregacja,
kompozycja
Iterator to obiekt który ma dwie metody: next i done
Agregacja
Kompozycja
Pakiety i
moduły
next podaje następny element,
done sprawdza, czy już skończyły się elementy
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
while not e l e m e n t y . done ( ) :
e l e m e n t = e l e m e n t y . next ( )
#z r o b c o s z e l e m e n t
W Pythonie zawsze można prościej:
for e l e m e n t in e l e m e n t y :
#z r o b c o s z e l e m e n t
Iterator - przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
class P a n g r a m I t e r a b l e :
def
init
( s e l f , pangram ) :
s e l f . pangram = pangram
def
iter
( self ) :
return P a n g r a m I t e r a t o r ( s e l f . pangram )
class P a n g r a m I t e r a t o r :
def
init
( s e l f , pangram ) :
s e l f . s l o w a = [ s . c a p i t a l i z e ( ) for s in
pangram . s p l i t ( ) ]
s e l f . index = 0
def
next ( self ) :
if s e l f . i n d e x == len ( s e l f . s l o w a ) :
raise S t o p I t e r a t i o n ( )
slowo = s e l f . slowa [ s e l f . index ]
s e l f . i n d e x += 1
return s l o w o
def
iter
( self ) :
return s e l f
cdn.
Iterator - przykład
Programowanie
obiektowe
Forma dłuższa:
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
p a n g r a m i t e r a b l e = P a n g r a m I t e r a b l e ( ’the quick brown
fox jumps over the lazy dog ’ )
i t e r a t o r = iter ( p a n g r a m i t e r a b l e )
while True :
try :
print ( next ( i t e r a t o r ) )
except S t o p I t e r a t i o n :
break
Forma krótsza: pangram iterable = PangramIterable(’Mężny
bądź, chroń pułk twój i sześć flag’)
Czemu testować
Czemu testować
for i in p a n g r a m i t e r a b l e :
print ( i )
Testowanie - czemu to ważne
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
niektórzy twierdzą, że to ze względu na dynamiczną naturę
(wszystko można zmienić) testowanie w Pythonie jest
jeszcze ważniejsze niż w innych językach,
ale testy tak naprawdę nie sprawdzają typów tylko wartości,
to dlaczego w Pythonie pisze się tak dużo testów?
bo to w nim bardzo łatwe.
Testujemy po to, żeby się upewnić, że kod działa
prawidłowo.
Testowanie - czemu to ważne
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
Ponieważ przy poprawkach możemy zepsuć inna rzecz niż
ta którą naprawialiśmy, warto testy zautomatyzować.
przy większych programach testowanie ręczne całości
programu jest praktycznie niemożliwe.
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
w okolicach 2000 roku spopularyzowały się pojęcia TDD
(Test Driven Development - Programowanie Napędzane
Testami ;) ) i Unit Tests (testy jednostkowe).
Testy - przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
class Konto :
def
init
( s e l f , numer , kwota ) :
s e l f . numer=numer
s e l f . kwota = kwota
def w y p l a c ( s e l f , w a r t o s c ) :
s e l f . kwota −= w a r t o s c
def w p l a c ( s e l f , w a r t o s c ) :
s e l f . kwota −= w a r t o s c #c e l o w a pomylka
def p r z e l e w ( s e l f , d o c e l o w e , kwota ) :
s e l f . w y p l a c ( kwota )
d o c e l o w e . w p l a c ( kwota )
Testy - przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
import u n i t t e s t
class K o n t a T est ( u n i t t e s t . T e s t C a s e ) :
def t e s t p r z e l e w p r o s t y ( s e l f ) :
k o n t o g l o w n e = Konto ( " 1234 " , 1 0 0 )
k o n t o d o d a t k o w e = Konto ( " 1235 " , 2 0 0 )
konto glowne . p r z e l e w ( konto dodatkowe , 50)
s e l f . a s s e r t E q u a l ( k o n t o g l o w n e . kwota , 5 0 )
s e l f . a s s e r t E q u a l ( k o n t o d o d a t k o w e . kwota , 2 5 0 )
Serializacja
def t e s t p r z e l e w z l o z o n y ( s e l f ) :
k o n t o g l o w n e = Konto ( " 1234 " , 1 0 0 )
k o n t o d o d a t k o w e = Konto ( " 1235 " , 2 0 0 )
konto glowne . p r z e l e w ( konto dodatkowe , 50)
konto dodatkowe . p r z e l e w ( konto glowne , 150)
s e l f . a s s e r t E q u a l ( k o n t o g l o w n e . kwota , 2 0 0 )
s e l f . a s s e r t E q u a l ( k o n t o d o d a t k o w e . kwota , 1 0 0 )
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
if
name
== " __main__ " :
u n i t t e s t . main ( )
Testy - przykład
Programowanie
obiektowe
Agregacja,
kompozycja
Agregacja
Kompozycja
Pakiety i
moduły
Moduły
Pakiety
Serializacja
pikle
Wzorce
projektowe
Wzorzec Iterator
Testowanie
przy OOP
Czemu testować
Czemu testować
FF
FAIL : t e s t p r z e l e w p r o s t y ( m a i n . KontaTest )
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
T r a c e b a c k ( most r e c e n t c a l l l a s t ) :
F i l e " kontaTesty . py " , l i n e 1 9 , in
test przelew prosty
s e l f . a s s e r t E q u a l ( k o n t o d o d a t k o w e . kwota , 2 5 0 )
A s s e r t i o n E r r o r : 150 != 250
=============================================
FAIL : t e s t p r z e l e w z l o z o n y ( m a i n . KontaTest )
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
T r a c e b a c k ( most r e c e n t c a l l l a s t ) :
F i l e " kontaTesty . py " , l i n e 2 6 , in
test przelew zlozony
s e l f . a s s e r t E q u a l ( k o n t o g l o w n e . kwota , 2 0 0 )
A s s e r t i o n E r r o r : −100 != 200
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Ran 2 t e s t s in 0 . 0 0 5 s
FAILED ( f a i l u r e s =2)