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

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

Programowanie obiektowe

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

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Programowanie i projektowanie obiektowe

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

Kurs rozszerzony języka Python

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

PHP 5 język obiektowy

Zaawansowany kurs języka Python

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Metaprogramowanie w Ruby

Podstawy programowania w Pythonie

Funkcje są prawdopodobnie najważniejszą częścią każdego poważnego programu (w każdym języku programowania).

Python. Wprowadzenie. Jolanta Bachan

Wstęp do programowania

Zaawansowany kurs języka Python

Lab 9 Podstawy Programowania

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie zaawansowane

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe

Podstawy programowania: Python. Wprowadzenie. Jolanta Bachan

Spis treści. Optymalizacja jednowymiarowa

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

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Listy, krotki, słowniki, funkcje

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

rozdział 4: ZMIENNE I INSTRUKCJE

Kurs rozszerzony języka Python

Dziedziczenie jednobazowe, poliformizm

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

Programowanie - wykład 4

Programowanie obiektowe

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

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:

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

Wykład 8: klasy cz. 4

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Podstawy bioinformatyki 2017/18

Informatyka II Laboratorium 3 : Programowania obiektowe C++ - dziedziczenie

Programowanie obiektowe

Kurs rozszerzony języka Python

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Języki i techniki programowania Ćwiczenia 2

Rozdział 4 KLASY, OBIEKTY, METODY

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Python wstęp. Michał Bereta

Programowanie w języku Python. Grażyna Koba

Zaawansowany kurs języka Python

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Program 14. #include <iostream> #include <ctime> using namespace std;

Programowanie obiektowe

Programowanie obiektowe

Programowanie i projektowanie obiektowe

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Sphinx - system dokumentacji dla Pythona

Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1

Wykład 5: Klasy cz. 3

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Kumulowanie się defektów jest możliwe - analiza i potwierdzenie tezy

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

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Język C++ zajęcia nr 2

Enterprise JavaBeans (EJB)


void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

Programowanie obiektowe

Kurs języka Python. Wątki

Metody Metody, parametry, zwracanie wartości

I - Microsoft Visual Studio C++

Kurs rozszerzony języka Python

Aplikacje w środowisku Java

Programowanie obiektowe

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

TECHNOLOGIE INTERNETOWE WYKŁAD 6. JavaScript Funkcje i obiekty

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

Definicje klas i obiektów. Tomasz Borzyszkowski

Deklaracja i definicja metod, zwracanie wartości z metod, przekazywania parametrów do metod

Warsztaty dla nauczycieli

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Programowanie obiektowe

Język C, tablice i funkcje (laboratorium, EE1-DI)

Programowanie w Ruby

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Technologia Programowania 2016/2017 Wykład 4

Transkrypt:

Spis treści 1 Dekoratory 1.1 Zadanie 1 1.2 Zadanie 2 1.3 Zadanie 3 1.4 Zadanie 4 Dekoratory Dekoratory w Pythonie służą do zastępowania zdefiniowanych przez nas funkcji przez funkcje (lub inne obiekty) zgodnie z definicją dekoratora. Na początku najlepiej zapoznać się z prostym przykładem dekoratora, który powoduje, że przed i po wywołaniu dekorowanej funkcji wypisywane są linie informujące o tym jaka funkcja jest wywoływana: def init (self, f): self.f = f def call (self): print 'przed wejściem do ', self.f. name self.f() print 'po wyjściu z ', self.f. name def g(): print 'wewnątrz g' g() Taki sam efekt można osiągnąć wpisując w ciało funkcji g dwie dodatkowe linijki, więc jakie są zalety wykorzystywania dekoratorów? Po pierwsze jeśli w podobny sposób chcemy zmodyfikować nie jedną ale wiele funkcji to napisanie dekoratora znacznie ułatwi to zadanie, ponadto dekorowanie funkcji jest łatwo zauważalne przez czytającego kod (dzięki @), pozwala na logiczne oddzielenie funkcjonalności na przykład właściwego działania funkcji od kodu realizującego logowanie użytkownika. Dekorowanie należy rozumieć jako składanie funkcji, kod z przykładu jest równoważny poniższemu: def init (self, f): self.f = f def call (self): print 'przed wejściem do ', self.f. name self.f()

print 'po wyjściu z ', self.f. name # def g(): print 'wewnątrz g' g = decorator(g) g() Dekoratory można definiować za pomocą klas lub funkcji, można dekorować funkcje mające argumenty lub nie, w końcu same dekoratory mogą przyjmować argumenty lub nie - omówimy teraz wszystkie te przypadki. Dekorator bezargumentowy zadany przez klasę musi mieć konstruktor przyjmujący jeden argument - funkcję, którą dekorujemy i implementować metodę call. Jeśli dekorujemy funkcję, która przyjmuje argumenty i chcemy aby funkcja po udekorowaniu przyjmowała takie same argumenty to metoda call musi przyjmować takie argumenty: def init (self, f): self.f = f def call (self, a, b, c): print 'przed wejściem do ', self.f. name self.f(a, b, c) print 'po wyjściu z ', self.f. name def g(a, b, c): W tym przykładzie w czasie dekorowania zostanie wywołany konstruktor klasy decorator, a później przy wywołaniu funkcji g zostanie wywołana metoda call klasy dekorator. Analogiczny dekorator zdefiniowany za pomocą funkcji musi być funkcją przyjmującą jeden parametr - funkcję, którą należy udekorować i zwracającą funkcję, którą funkcja dekorowana będzie zastąpiona: def decorator(f): def inner(a, b, c): print 'przed wejściem do ', f. name f(a, b, c) print 'po wyjściu z ', f. name

def g(a, b, c): Tym razem przy dekorowaniu zostanie wykonana funkcja decorator, a przy wywoływaniu funkcji g będzie wywoływana funkcja inner Kolejnym zagadnieniem jest tworzenie dekoratorów przyjmujących argumenty. Dekorator przyjmujący argumenty będący klasą musi mieć konstruktor przyjmujący dane argumenty i metodę call przyjmującą dokładnie jeden argument - funkcję dekorowaną - i zwracającą funkcję, którą należy podstawić w miejsce dekorowanej: def init (self, a): self.a = a def call (self, f): def inner(a, b, c): print 'parametr dekoratora a =', a print 'przed wejściem do ', f. name f(a, b, c) print 'po wyjściu z ', f. name (5) def g(a, b, c): Tym razem w momencie dekorowania zostanie wywołany konstruktor klasy dekorator i metoda call (będzie ona wywoływana tylko podczas dekorowania), a jej wynik zostanie przypisany na zmienną przechowującą dekorowaną funkcję. Przy wywołaniu funkcji g będzie wywoływana funkcja inner. Jeśli chcemy zrealizować analogiczną konstrukcję przy pomocy funkcji to dekorator musi być funkcją, która przyjmuje parametry dekoratora i zwraca funkcję, która przyjmuje dokładnie jeden argument - funkcję dekorowaną i zwraca funkcję, która ma być podstawiona w miejsce funkcji dekorowanej: def decorator(a): def wrapper(f): def inner(a, b, c): print 'parametr dekoratora a =', a print 'przed wejściem do ', f. name f(a, b, c) print 'po wyjściu z ', f. name

return wrapper (5) def g(a, b, c): W tym przypadku podczas dekorowania zostanie wywołana funkcja decorator z argumentem 5 i funkcja wrapper z argumentem g, wywołując później funkcję g będziemy wywoływali funkcję inner. W Pythonie mamy dwa wbudowane dekoratory - classmethod i staticmethod - służą one do definiowania metod w klasach, które nie wymagają instancji klasy do ich wywołania - mogą być wywoływane przez klasę - metody udekorowane classmetod jako pierwszy parametr otrzymują klasę na rzecz której zostały wywołane, a staticmethod nie wiedzą nawet na rzecz jakiej klasy zostały wywołane: class A(object): def normalna(self): print "metoda normalna, wywołana na obiekcie", self @classmethod def klasowa(cls): print "metoda klasowa, wywołana na klasie", cls @staticmethod def statyczna(): print "metoda statyczna" A.klasowa() A.statyczna() A().normalna() Zauważ, że do wywołania metod statyczna() i klasowa() nie potrzebowaliśmy tworzyć obiektu klasy A, z kolei próba wywołania metody normalna() na klasie powoduje wyjątek: >>> A.normalna() Traceback (most recent call last): File "<pyshell#195>", line 1, in <module> A.normalna() TypeError: unbound method normalna() must be called with A instance as first argument (got nothing instead) Dekoratory można też wykorzystywać do modyfikowania klas, jeśli na przykład chcemy dodać zmienną klasową a i metodę b do klasy A możemy stworzyć następujący dekorator:

def decorator(c): C.a = 5 def b(self): print self C.b = b return C class A(object): pass a = A() a.b() print a.a Funkcje i klasy można dekorować wieloma dekoratorami na raz: def A(f): def inner(): print 'dekorator A' f() def B(f): def inner(): print 'dekorator B' f() @A @B def f(): print 'funkcja f' f() Zadanie 1 Napisz dekorator modelujący pamięć dla funkcji, tak aby gdy powtórnie wywołamy ją z jakimiś parametrami funkcja nie była wywoływana i zwracana była wartość jaką otrzymano wcześniej dla tych samych argumentów. Zadanie 2 Napisz dekorator do funkcji zwracającej wartość logiczną wywołujący funkcję do czasu gdy zwróci

True. Przetestuj na funkcji czytającej z wejścia i sprawdzającej czy użytkownik wpisał 'python'. Niech dekorator jako argument przyjmuje liczbę całkowitą oznaczającą maksymalną liczbę prób wywołania funkcji dekorowanej. Zadanie 3 Napisz dekorator, który będzie wymagał podania hasła przed właściwym wywołaniem funkcji, jeśli zostanie podane błędne hasło to niech będzie wypisany komunikat o braku dostępu. Zadanie 4 Napisz dekorator rejestrujący funkcje do listy będącej parametrem dekoratora, a następnie wywołaj wszystkie funkcje z listy "Programowanie dla Fizyków Medycznych"