Programowanie obiektowe

Podobne dokumenty
Zaawansowany kurs języka Python

Kurs języka Python. Wykład 11. Marcin Młotkowski. 4 stycznia Kontrola poprawności podczas biegu programu. 2 Testowanie oprogramowania

Język Python (2) Język Python (2) 1/36

Kurs rozszerzony języka Python

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Programowanie obiektowe

Język Python. Język Python 1/35

Podstawy programowania w Pythonie

Spis treści. Dekoratory. 1 Dekoratory 1.1 Zadanie Zadanie Zadanie Zadanie 4

Programowanie obiektowe

Wątki i komunikacja między nimi w języku Python

Python. Wprowadzenie. Jolanta Bachan

Środowisko programisty

Pisząc kod w Pythonie na pewno już nie raz coś poszło nie tak i Shell wypisał komunikat o błędzie podobny do poniższego:

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

Programowanie i projektowanie obiektowe

Słowa kluczowe jak góry lodowe

Informatyka 2015/16 wykład 9. Pliki Sterowanie przebiegiem programu cz. 2. Dr inż. Witold Nocoń (p. 230)

Język Python (3) Język Python (3) 1/35

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową

Hackowanie zamrożonych binariów


Kurs rozszerzony języka Python

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Wykład 6 Dziedziczenie cd., pliki

Programowanie w Sieci Internet. Python: Operacje z plikami oraz obsługa wyjątków

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Zaawansowany kurs języka Python

Przegląd języka Python. Łukasz Anwajler

Zaawansowany kurs języka Python

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

rozdział 4: ZMIENNE I INSTRUKCJE

Kurs języka Python Wykład 6. Pliki tekstowe Pliki rekordów Pliki CSV Strumienie

Testy aplikacji webowych

Programowanie Zespołowe

Podstawy programowania w Pythonie

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

Programowanie obiektowe

Środowisko programisty

Podstawy programowania w Pythonie

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Kurs rozszerzony języka Python

Ada95 przetwarzanie rozproszone

Ada95 przetwarzanie rozproszone

Kurs języka Python Wykład 8. Przetwarzanie tekstu Wyrażenia regularne Biblioteka urllib Parsowanie html'a XML

Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Ćwiczenie 3. Python 3: Python 3: Funkcje, moduły i operacje na plikach

Typy danych, cd. Łańcuchy znaków

Język Java część 2 (przykładowa aplikacja)

Sphinx - system dokumentacji dla Pythona

Programowanie obiektowe

Podstawy programowania: Python. Wprowadzenie. Jolanta Bachan

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

System operacyjny Linux

Języki i metody programowania Java Lab2 podejście obiektowe

Struktury. Przykład W8_1

Wprowadzenie do Python

Wstęp do programowania

Testowanie aplikacji. Kurs języka Ruby

Programowanie obiektowe

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Podstawy Programowania Obiektowego

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Kurs rozszerzony języka Python

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Programowanie w języku Python. Grażyna Koba

Wstęp do Pythona. Janusz Szwabiński. Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński p.1/36

Programowanie obiektowe

1 Atrybuty i metody klasowe

Dokumentacja do API Javy.

Analiza i projektowanie aplikacji Java

Szablony funkcji i szablony klas

Budowa aplikacji webowej w oparciu o Maven2 oraz przykłady testów jednostkowych. Wykonał Marcin Gadamer

NAJLEPSZE STRATEGIE SKUTECZNYCH PROGRAMISTÓW. TECHNIKI PRACY Z KODEM KOD: NSKOD

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Języki i metody programowania

Metaprogramowanie w Ruby

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Czym jest wykrywanie kolizji. Elementarne metody detekcji kolizji. Trochę praktyki: Jak przygotować Visual Studio 2010 do pracy z XNA pod Windows

Przedmiotowy Konkurs Informatyczny LOGIA powołany przez Mazowieckiego Kuratora Oświaty

Język programowania. Andrzej Bobyk

Przedmiot: Informatyka w inżynierii produkcji Forma: Laboratorium Temat: Zadanie 4. Instrukcja warunkowa.

Podstawy programowania. Ćwiczenie. Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio

Język Java część 2 (przykładowa aplikacja)

Zaawansowany kurs języka Python

Układ równań liniowych

Programowanie i projektowanie obiektowe

Listy powiązane zorientowane obiektowo

Wstęp do programowania

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Programowanie w Ruby

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Lifehacking dla R. Przemyślenia i rozwiązania w temacie reprodukowalności analiz i organizacji pracy

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Transkrypt:

Wykład 4 Piotr Błaszyński Wydział Inmatyki Zachodniopomorskiego Uniwersytetu Technologicznego 16 lutego 2018

i 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 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. nie tworzy klasy pochodnej, lecz zupełnie nowy typ.

- prosty przykład i class Reka : def i n i t ( s e l f, k t o r a ) : s e l f. k t o r a = k t o r a class Noga : def i n i t ( s e l f, k t o r a ) : s e l f. k t o r a = k t o r a class CialoSamo : def i n i t ( s e l f ) : 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. lewa noga = Noga ( "LEWA" ) s e l f. prawa noga = Noga ( "PRAWA" ) x = CialoSamo ( )

- prosty przykład i class Reka : def i n i t ( s e l f, k t o r a ) : s e l f. k t o r a = k t o r a class Noga : def i n i t ( s e l f, k t o r a ) : s e l f. k t o r a = k t o r a class C i a l o : def i n i t ( s e l f, l e w a r e k a, prawa reka, lewa noga, prawa noga ) : s e l f. l e w a r e k a = l e w a r e k a s e l f. p r a w a r e k a = p r a w a r e k a s e l f. lewa noga = lewa noga s e l f. prawa noga = prawa noga cdn.

- prosty przykład cd. i m o j a l e w a r e k a = Reka ( "LEWA" ) m o j a p r a w a r e k a = Reka ( "PRAWA" ) moja lewa noga = Noga ( "LEWA" ) moja prawa noga = Noga ( "PRAWA" ) x= C i a l o ( m o j a l e w a r e k a, moja prawa reka, moja lewa noga, moja prawa noga )

- bardziej realny przykład i class Punkt : def i n i t ( s e l f, x, y ) : s e l f. x = x s e l f. y = y def pokaz ( s e l f ) : print ( "X: " + str ( s e l f. x ) + " Y :" + str ( s e l f. y ) ) class Odcinek : def i n i t ( 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 pokaz ( s e l f ) : print ( "Punkt poczatkowy :", end = ) s e l f. punkt poczatkowy. pokaz ( ) print ( "Punkt koncowy :", end = ) s e l f. punkt koncowy. pokaz ( )

- bardziej realny przykład i Tworzenie obiektów, obiekty nazwane jako parametry, p o c z a t e k = Punkt ( 1 0, 15) k o n i e c = Punkt ( 2 0, 35) o d c i n e k = Odcinek ( poczatek, k o n i e c ) o d c i n e k. pokaz ( ) Wynik: Punkt poczatkowy : X : 10 Y : 1 5 Punkt koncowy : X : 20 Y : 3 5

- bardziej realny przykład i Tworzenie obiektów, obiekty jako parametry tworzone w trakcie konstruowania agregatu:, o d c i n e k = Odcinek ( Punkt ( 1 0, 15), Punkt ( 2 0, 35) ) o d c i n e k. pokaz ( ) Wynik: Punkt poczatkowy : X : 10 Y : 1 5 Punkt koncowy : X : 20 Y : 3 5

i 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 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.

- przykład i Definicja klas w klasie, trzeba się odpowiednio odwoływać: class CialoSamo : class Reka : def i n i t ( s e l f, k t o r a ) : s e l f. k t o r a = k t o r a class Noga : def i n i t ( s e l f, k t o r a ) : s e l f. k t o r a = k t o r a def i n i t ( s e l f ) : 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. lewa noga = CialoSamo. Noga ( "LEWA" ) s e l f. prawa noga = CialoSamo. Noga ( "PRAWA" ) x = CialoSamo ( )

- przykład i Definicja klas w metodzie, krótszy zapis, przy większych przypadkach może być jednak mało czytelne: class CialoSamo : def i n i t ( s e l f ) : class Reka : def i n i t ( s e l f, k t o r a ) : s e l f. k t o r a = k t o r a class Noga : def i n i t ( s e l f, k t o r a ) : s e l f. k t o r a = k t o r a 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. lewa noga = Noga ( "LEWA" ) s e l f. prawa noga = Noga ( "PRAWA" ) x = CialoSamo ( )

i Większy program można (od pewnego momentu wręcz należy) podzielić na : 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 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ą.

- przykłady i Plik osobamodule.py - jedna klasa w module class Osoba : def i n i t ( s e l f, imie, nazwisko ) : s e l f. i m i e = i m i e s e l f. nazwisko = nazwisko def pokaz ( s e l f ) : print ( s e l f. i m i e + + s e l f. nazwisko )

- przykłady i Plik osobamodule.py - jedna klasa w module >>> import OsobaModule Traceback ( 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 >>> import osobamodule >>> from osobamodule S y n t a x E r r o r : i n v a l i d s y n t a x >>> from osobamodule import Osoba

- przykłady i Plik osobamodule.py - jedna klasa w module >>> import osobamodule >>> x = Osoba ( "Jan", "Nowak" ) Traceback ( 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 >>> import osobamodule >>> x = osobamodule. Osoba ( "Jan", "Nowak" ) >>> x. pokaz ( ) Jan Nowak >>> from osobamodule import Osoba >>> x = osobamodule. Osoba ( "Jan", "Nowak" ) Traceback ( 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>

- przykłady i Plik osobamodule.py - jedna klasa w module >>> from osobamodule import Osoba x = osobamodule. Osoba ( "Jan", "Nowak" ) NameError : name osobamodule is not d e f i n e d >>> from osobamodule import Osoba >>> x = Osoba ( "Jan", "Nowak" ) >>> x. pokaz ( ) Jan Nowak >>>

- przykłady i Plik osobamodule.py - jedna klasa w module >>> from osobamodule import >>> x = osobamodule. Osoba ( "Jan", "Nowak" ) Traceback ( 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> >>> from osobamodule import x = osobamodule. Osoba ( "Jan", "Nowak" ) NameError : name osobamodule is not d e f i n e d >>> from osobamodule import >>> x = Osoba ( "Jan", "Nowak" ) >>> x. pokaz ( ) Jan Nowak

- przykłady i Plik osobamodule.py - dwie klasy w module class Osoba : def i n i t ( s e l f, imie, nazwisko ) : s e l f. i m i e = i m i e s e l f. nazwisko = nazwisko def pokaz ( s e l f ) : print ( s e l f. i m i e + + s e l f. nazwisko ) class Student ( Osoba ) : def i n i t ( s e l f, imie, nazwisko, n r i n d e k s u ) : super ( ). i n i t ( imie, nazwisko ) s e l f. n r i n d e k s u = n r i n d e k s u def pokaz ( s e l f ) : super ( ). pokaz ( ) print ( s e l f. n r i n d e k s u )

- przykłady i Plik osobamodule.py - dwie klasy w module >>> from osobamodule import Osoba, S t u d e n t >>> x=student ( "Jan", "Nowak", 1234) >>> x. pokaz ( ) Jan Nowak 1234

- przykłady i Plik osobamodule.py - dwie klasy w module, inne zachowanie niż w niektórych językach. >>> from osobamodule import Student >>> x = Student ( "Jan", "Nowak", 1234) >>> z = Osoba ( " Andrzej ", " Kowalski " ) Traceback ( 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 >>> from osobamodule import Student >>> x = Student ( "Jan", "Nowak", 1234) >>> x. pokaz ( ) Jan Nowak 1234

- korzystanie i Możliwość lokalnego korzystania z innej nazwy dla importowaneego modułu lub klasy: import nazwa modulu as 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 as l o k a l n a n a z w a k l a s y Dla klasy: >>> from osobamodule import Osoba a s P e r s o n >>> x=person ( " Andrzej ", "Abacki " ) >>> x <osobamodule. Osoba object a t 0x029FDE90> >>> x. d i c t { imie : Andrzej, nazwisko : Abacki }

- korzystanie i Możliwość lokalnego korzystania z innej nazwy dla importowaneego modułu lub klasy: import nazwa modulu as 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 as l o k a l n a n a z w a k l a s y Dla modułu: >>> import osobamodule a s omod >>> x=omod. Osoba ( " Andrzej ", "Abacki " ) >>> x <osobamodule. Osoba object a t 0x0278FDF0>

i Do grupowania modułów tak naprawdę kolejny poziom grupowania (abstrakcji), też można zagnieżdżać, Pakiet może zawierać jeden moduł, ale raczej powinien zawierać pewien zbiór modułów i innych rzeczy, Pakiet to kolekcja modułów w katalogu, nazwa pakietu to nazwa tego katalogu, żeby można było importować z pakietu, trzeba w nim umieścić (wystarczy pusty) plik init.py

- przykład i Pakiet o nazwie obiekty: o b i e k t y C i a l o. py CialoSamo. py i n i t. py + g e o m e t r i a Punkty. py i n i t. py \ osoby osobamodule. py i n i t. py Ciekawostka, powyższe uzyskać można poleceniem DOS: t r e e o b i e k t y /A /F

- importowanie i Z zewnątrz pakietu (bezwględny): 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 ( ) from n a z w a p a k i e t u. nazwa modulu import NazwaKlasy x = NazwaKlasy ( ) from n a z w a p a k i e t u import nazwa modulu x = nazwa modulu. NazwaKlasy ( )

- importowanie i Źle: >>> from o b i e k t y import CialoSamo >>> x=cialosamo ( ) Traceback ( 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=cialosamo ( ) TypeError : module object is not callable Dobrze: >>> from o b i e k t y. CialoSamo import CialoSamo >>> x=cialosamo ( ) >>> x <o b i e k t y. CialoSamo. CialoSamo object at 0x02A10CB0>

- importowanie i 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 = Odcinek ( Punkt ( 1 0, 15), Punkt ( 20, 35) ) >>> o d c i n e k. pokaz ( ) Punkt poczatkowy : X : 10 Y : 1 5 Punkt koncowy : X : 20 Y : 3 5 <o b i e k t y. CialoSamo. CialoSamo object at 0 x026199f0> Skąd ten obiekt na końcu?

- importowanie i Z wnętrza pakietu (wględny). Z pakietu z tego samego katalogu from. nazwa modulu import NazwaKlasy x = NazwaKlasy ( ) Z pakietu z katalogu wyżej (z pakietu nadrzędnego): from.. nazwa modulu import NazwaKlasy x = NazwaKlasy ( ) from.. n a z w a p a k i e t u. nazwa modulu import NazwaKlasy x = NazwaKlasy ( )

- importowanie i Jesteśmy w pliku osobamodule.py Dobrze: from. osobamodule import Osoba Jesteśmy w pliku Punkty.py from.. CialoSamo import CialoSamo

Zapis obiektów do pliku i 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.

- przykład i class CialoSamo : class Reka : def i n i t ( s e l f, k t o r a ) : s e l f. k t o r a = k t o r a class Noga : def i n i t ( s e l f, k t o r a ) : s e l f. k t o r a = k t o r a def i n i t ( s e l f ) : 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. lewa noga = CialoSamo. Noga ( "LEWA" ) s e l f. prawa noga = CialoSamo. Noga ( "PRAWA" ) cdn.

- przykład i Przy okazji dobry sposób na współpracę z plikiem: x = CialoSamo ( ) import p i c k l e with open ( "cialo.bin", wb ) as file : p i c k l e. dump( x, file ) with open ( "cialo.bin", rb ) as 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 ) Wynik (zapisaliśmy obiekt x do pliku i wczytaliśmy go jako z): LEWA

- przykład i Wersja z przesyłaniem ciągu bajtów: 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 = p i c k l e. l o a d s ( z r z u t b a j t o w y ) 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

i 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 Każdy wzorzec projektowy proponuje zestaw obiektów oddziałujących w specyficzny sposób w celu rozwiązania ogólnego problemu.

i Iterator to obiekt który ma dwie metody: next i done next podaje następny element, done sprawdza, czy już skończyły się elementy while not e l e m e n t y. done ( ) : element = e l e m e n t y. next ( ) #z rob cos z element W Pythonie zawsze można prościej: element in e l e m e n t y : #z rob cos z element

Iterator - przykład i class P a n g r a m I t e r a b l e : def i n i t ( s e l f, pangram ) : s e l f. pangram = pangram def i t e r ( s e l f ) : 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 i n i t ( s e l f, pangram ) : s e l f. slowa = [ s. c a p i t a l i z e ( ) s in pangram. s p l i t ( ) ] s e l f. i n d e x = 0 def n e x t ( s e l f ) : if s e l f. i n d e x == len ( s e l f. slowa ) : raise S t o p I t e r a t i o n ( ) slowo = s e l f. slowa [ s e l f. i n d e x ] s e l f. i n d e x += 1 return slowo def i t e r ( s e l f ) : return s e l f cdn.

Iterator - przykład i Forma dłuższa: 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 ) i in p a n g r a m i t e r a b l e : print ( i )

- czemu to ważne i 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.

- czemu to ważne i 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. w okolicach 2000 roku spopularyzowały się pojęcia TDD (Test Driven Development - Napędzane Testami ;) ) i Unit Tests (testy jednostkowe).

Testy - przykład i class Konto : def i n i t ( s e l f, numer, kwota ) : s e l f. numer=numer s e l f. kwota = kwota def wyplac ( s e l f, w a r t o s c ) : s e l f. kwota = w a r t o s c def wplac ( s e l f, w a r t o s c ) : s e l f. kwota = w a r t o s c #celowa pomylka def p r z e l e w ( s e l f, docelowe, kwota ) : s e l f. wyplac ( kwota ) docelowe. wplac ( kwota )

Testy - przykład i import u n i t t e s t class KontaTest ( u n i t t e s t. TestCase ) : 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", 100) konto dodatkowe = Konto ( "1235", 200) k o n t o g l o w n e. 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, 50) s e l f. a s s e r t E q u a l ( konto dodatkowe. kwota, 250) 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", 100) konto dodatkowe = Konto ( "1235", 200) k o n t o g l o w n e. 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, 200) s e l f. a s s e r t E q u a l ( konto dodatkowe. kwota, 100) if n a m e == " main " : u n i t t e s t. main ( )

Testy - przykład i FF FAIL : t e s t p r z e l e w p r o s t y ( m a i n. KontaTest ) Traceback ( 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 19, in t e s t p r z e l e w p r o s t y s e l f. a s s e r t E q u a l ( konto dodatkowe. kwota, 250) 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 ) Traceback ( 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 26, in t e s t p r z e l e w z l o z o n y 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, 200) 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.005 s FAILED ( f a i l u r e s =2)

i Zamiast: e l e m e n t s = [ ( 1, 2), ( 3, 4 ), ( 8, 9 ) ] i in range ( len ( e l e m e n t s ) : print ( e l e m e n t s [ i ] ) Lepiej napisać: e l e m e n t s = [ ( 1, 2), ( 3, 4 ), ( 8, 9 ) ] element in e l e m e n t s : print ( element )

i Zamiast: e l e m e n t s = [ ( 1, 2), ( 3, 4 ), ( 8, 9 ) ] i in range ( len ( e l e m e n t s ) ) : print ( i, e l e m e n t s [ i ] ) Lepiej napisać: e l e m e n t s = [ ( 1, 2), ( 3, 4 ), ( 8, 9 ) ] i, element in ( e l e m e n t s ) : print ( i, element )

zip i c o l o r h e x = [ "0 xff0000 ", "0 x00ff00 ", "0 x0000ff " ] c o l o r n a m e s = [ "red", "green", "blue" ] Zamiast: l e n g t h = min ( len ( c o l o r h e x ), len ( c o l o r n a m e s ) ) c o l o r s ={} i in range ( ) : c o l o r s [ c o l o r n a m e s [ i ] ] = c o l o r h e x [ i ] k, v in c o l o r s. i t e m s ( ) : print ( k, v ) Lepiej napisać: c o l o r s = zip ( c o l o r n a m e s, c o l o r h e x ) k, v in c o l o r s : print ( k, v )

zip i c o l o r h e x = [ "0 xff0000 ", "0 x00ff00 ", "0 x0000ff " ] c o l o r n a m e s = [ "red", "green", "blue" ] Zamiast: l e n g t h = min ( len ( c o l o r h e x ), len ( c o l o r n a m e s ) ) c o l o r s ={} i in range ( ) : c o l o r s [ c o l o r n a m e s [ i ] ] = c o l o r h e x [ i ] k, v in c o l o r s. i t e m s ( ) : print ( k, v ) Lepiej napisać (najczęściej nie musimy takiej wersji używać): c o l o r s ={} name, h e x v a l u e in zip ( c o l o r n a m e s, c o l o r h e x ) : c o l o r s [ name ] = h e x v a l u e k, v in c o l o r s. i t e m s ( ) : print ( k, v )