Programowanie i projektowanie obiektowe

Podobne dokumenty
Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

Programowanie obiektowe

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

Kurs rozszerzony języka Python

Programowanie i projektowanie obiektowe

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

Programowanie i projektowanie obiektowe

Programowanie obiektowe

Programowanie obiektowe

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

Oracle PL/SQL. Paweł Rajba.

Kurs WWW. Paweł Rajba.

Diagramy klas. dr Jarosław Skaruz

Wstęp do programowania

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Programowanie Obiektowe i C++

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

Programowanie obiektowe

Klasy abstrakcyjne, interfejsy i polimorfizm

Języki i metody programowania Java. Wykład 2 (część 2)

Programowanie obiektowe - 1.

Materiały do zajęć VII

PHP 5 język obiektowy

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

Wykład 8: klasy cz. 4

Programowanie obiektowe

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Technologie i usługi internetowe cz. 2

Programowanie Obiektowe i C++

Dokumentacja do API Javy.


Common Lisp - funkcje i zmienne

1 Atrybuty i metody klasowe

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe

Podstawy Programowania Obiektowego

Programowanie obiektowe w języku

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Definicje klas i obiektów. Tomasz Borzyszkowski

Wstęp do programowania

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Podstawy Języka Java

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Dziedziczenie. dr Jarosław Skaruz

Programowanie Obiektowe i C++

Programowanie 2. Język C++. Wykład 3.

Metaprogramowanie w Ruby

Programowanie obiektowe

Programowanie, część I

Zaawansowany kurs języka Python

Python in the Enterprise

10. Programowanie obiektowe w PHP5

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

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

Programowanie obiektowe

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie Obiektowe i C++

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Wykład 5: Klasy cz. 3

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

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Język C++ Programowanie obiektowe

Aplikacje w środowisku Java

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

Wstęp do programowania

.NET Klasy, obiekty. ciąg dalszy

Spis treści. The Zen of Python

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Programowanie Obiektowe i C++ Marcin Benke

Podstawy programowania obiektowego

Zaawansowany kurs języka Python

Programowanie Obiektowe i C++

Dziedziczenie. Ogólna postać dziedziczenia klas:

Polimorfizm. dr Jarosław Skaruz

Programowanie obiektowe

Programowanie obiektowe

Wstęp do programowania obiektowego. Wykład 2

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

Technologie obiektowe

Przeciążanie operatorów

Programowanie obiektowe w VB cz 2

Paweł Kurzawa, Delfina Kongo

Dziedziczenie w Javie

Zaawansowany kurs języka Python

Programowanie w Ruby

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Programowanie obiektowe

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Wywoływanie metod zdalnych

Transkrypt:

Programowanie i projektowanie obiektowe Python od środka Paweł Daniluk Wydział Fizyki Jesień 2014 P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 1 / 48

Zasięgi nazw (ang. scopes) Przestrzeń nazw Mapowanie nazw (zmiennych) do wartości (obiektów). Jest związane z: klasami obiektami modułami Dodatkowo występują przestrzenie: lokalna (locals()) globalna (globals()) wbudowana ( builtin ) Przestrzenie nazw są niezależne. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 2 / 48

Zasięgi nazw (ang. scopes) Zasięgi Zasięgi są związane z funkcjami. Zmienne występujące w funkcji są widoczne w jej leksykalnym obrębie i należą do lokalnej przestrzeni nazw. Przypisanie zawsze dotyczy najsilniej zagnieżdżonego zasięgu. Zasięg, w którym funkcja została zdefiniowana istnieje wraz z nią. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 3 / 48

Zasięgi przykłady d ef f ( ) : p r i n t ( x ) x = g l o b a l f ( ) d ef f ( ) : x = f p r i n t ( x ) x = g l o b a l p r i n t ( x ) f ( ) p r i n t ( x ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 4 / 48

Zasięgi przykłady d ef f ( ) : p r i n t ( x ) x = f x = g l o b a l f ( ) d ef f ( ) : p r i n t ( x ) d ef g ( ) : g l o b a l x p r i n t ( x ) x = g x = g l o b a l f ( ) g ( ) f ( ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 5 / 48

Zasięgi przykłady x = g l o b a l d ef f ( ) : d e f g ( ) : g l o b a l x p r i n t ( x ) x = f g ( ) f ( ) d ef f ( ) : d e f g ( ) : n o n l o c a l x = g x = f g ( ) p r i n t ( x ) x x = g l o b a l f ( ) p r i n t ( x ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 6 / 48

Implementacja przestrzeni nazw Przestrzenie nazw są zazwyczaj implementowane przy pomocy słowników. Często słownik dostępny jest przez atrybut dict. Funkcje locals() globals() dir([object]) zwraca zmienne w bieżącym zasięgu lub atrybuty dostępne w obiekcie (niekoniecznie własne) Można zrobić klasę, której obiekty nie mają atrybutu dict. Służy do tego atrybut slots. c l a s s A( o b j e c t ) : slots =[ a1, a2 ] Klasa A ma tylko dwa atrybuty a1 i a2. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 7 / 48

Typy i obiekty Każda wartość w Pythonie jest obiektem (nawet liczba). Każdy obiekt ma unikalny identyfikator (id()) Każdy obiekt ma typ (type()) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 8 / 48

Typy wbudowane w Pythona None NotImplemented Ellipsis numbers.number numbers.integral numbers.real numbers.complex Sequences immutable strings unicode tuples mutable lists byte arrays P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 9 / 48

Typy wbudowane w Pythona sets set frozenset mappings callable types user-defined functions user-defined methods generator functions built-in functions built-in methods class types (new-style) classic classes class instances (czasem) modules classes class instances files P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 10 / 48

Funkcje są obiektami Funkcje mogą być traktowane jak wartości: przypisywane na zmienną, przekazywane jako parametry. Funkcje mogą mieć atrybuty. >>> def f():... pass... >>> f.atr=1 >>> f.atr 1 P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 11 / 48

Funkcje są obiektami Funkcje nazwane d ef f ( x ) : r e t u r n x+1 Funkcje anonimowe f=lambda x : x+1 P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 12 / 48

Czym się różni funkcja od metody? >>> class A():... def f(self):... pass... >>> A. dict module : main, doc : None, f : <function f at 0x10e3615f0> >>> A.f <unbound method A.f> >>> A().f <bound method A.f of < main.a instance at 0x10e1fdb90>> Funkcje są atrybutami klas. Pobranie atrybutu, który jest funkcją, skutkuje zwróceniem metody. Metoda może być przywiązana lub nie. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 13 / 48

Czym się różni funkcja od metody? c.d. Metody mają atrybuty: im_class klasa im_func funkcja (atrybut klasy) im_self obiekt (określony tylko w metodzie przywiązanej) Metoda przywiązana Obiekt, który można wywołać (ma metodę call ). Wywołanie powoduje przekazanie do funkcji parametru self oraz pozostałych podanych w wywołaniu metody. Metoda nieprzywiązana Metoda nieprzywiązana różni się od funkcji tym, że weryfikuje, czy pierwszy parametr jest instancją klasy, z której metoda pochodzi. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 14 / 48

Nowe i stare klasy (new-style classes, classic classes) Classic classes Niezależne od systemu typów. Instancje klas są typu <type instance >. New-style classes Włączone w system typów. Typ instancji jest równy jej klasie. Dziedziczą z klasy object. Możliwości klas w nowym stylu metody statyczne i klasowe cechy i deskryptory lepsze wielodziedziczenie metaklasy slots P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 15 / 48

Wielodziedziczenie (ang. multiple inheritance) Czasami występuje potrzeba opisu klas, które łączą w sobie cechy kilku klas nadrzędnych (np. latająca łódź). Wielodziedziczenie może powodować straszne problemy (Deadly Diamond of Death). Niezwykle istotne są reguły wyszukiwania metod (Method Resolution Order MRO). P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 16 / 48

Wielodziedziczenie (ang. multiple inheritance) Czasami występuje potrzeba opisu klas, które łączą w sobie cechy kilku klas nadrzędnych (np. latająca łódź). Wielodziedziczenie może powodować straszne problemy (Deadly Diamond of Death). Niezwykle istotne są reguły wyszukiwania metod (Method Resolution Order MRO). Stare i nowe klasy różnią się MRO. W nowych klasach zawsze występuje diament (bo dziedziczą z object). Linearyzacja Kolejność klas w MRO zachowuje porządek wynikający z dziedziczenia (nadklasa zawsze po podklasie) i kolejności występowania nadklas w definicji klasy. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 16 / 48

Wielodziedziczenie c.d. Niektóre hierarchie nie pozwalają na linearyzację c l a s s A( o b j e c t ) : d e f meth ( s e l f ) : r e t u r n "A" c l a s s B( o b j e c t ) : d e f meth ( s e l f ) : r e t u r n "B" c l a s s X(A, B ) : pass c l a s s Y(B, A ) : pass c l a s s Z(X, Y ) : pass P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 17 / 48

Jak dostać się do nadklasy? Metoda rozszerzająca zazwyczaj wywołuje metodę z nadklasy. Problem c l a s s A( o b j e c t ) : d e f m( s e l f ) : " s a v e A s data " c l a s s B(A ) : d e f m( s e l f ) : " s a v e B s data " A.m( s e l f ) c l a s s C(A ) : d e f m( s e l f ) : " s a v e C s data " A.m( s e l f ) c l a s s D(B, C ) : d e f m( s e l f ) : " s a v e D s data " B.m( s e l f ) ; C.m( s e l f ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 18 / 48

Jak dostać się do nadklasy? Metoda rozszerzająca zazwyczaj wywołuje metodę z nadklasy. Problem c l a s s A( o b j e c t ) : d e f m( s e l f ) : " s a v e A s data " c l a s s B(A ) : d e f m( s e l f ) : " s a v e B s data " A.m( s e l f ) c l a s s C(A ) : d e f m( s e l f ) : " s a v e C s data " A.m( s e l f ) c l a s s D(B, C ) : d e f m( s e l f ) : " s a v e D s data " B.m( s e l f ) ; C.m( s e l f ) Wywołanie D.m() spowoduje dwukrotne wykonanie A.m(). P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 18 / 48

Jak dostać się do nadklasy? c l a s s A( o b j e c t ) : d e f m( s e l f ) : " s a v e A s data " c l a s s B(A ) : d e f _m( s e l f ) : " s a v e B s data " d e f m( s e l f ) : s e l f._m( ) ; A.m( s e l f ) c l a s s C(A ) : d e f _m( s e l f ) : " s a v e C s data " d e f m( s e l f ) : s e l f._m( ) ; A.m( s e l f ) c l a s s D(B, C ) : d e f _m( s e l f ) : " s a v e D s data " d e f m( s e l f ) : s e l f._m( ) ; B._m( s e l f ) ; C._m( s e l f ) ; A.m( s e l f ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 19 / 48

Jak dostać się do nadklasy? c l a s s A( o b j e c t ) : d e f m( s e l f ) : " s a v e A s data " c l a s s B(A ) : d e f _m( s e l f ) : " s a v e B s data " d e f m( s e l f ) : s e l f._m( ) ; A.m( s e l f ) c l a s s C(A ) : d e f _m( s e l f ) : " s a v e C s data " d e f m( s e l f ) : s e l f._m( ) ; A.m( s e l f ) c l a s s D(B, C ) : d e f _m( s e l f ) : " s a v e D s data " d e f m( s e l f ) : s e l f._m( ) ; B._m( s e l f ) ; C._m( s e l f ) ; A.m( s e l f ) To rozwiązanie jest poprawne, ale implementacja D musi uwzględnić istnienie klasy A. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 19 / 48

Strategia następnej metody c l a s s A( o b j e c t ) : d e f m( s e l f ) : " s a v e A s data " c l a s s B(A ) : d e f m( s e l f ) : " s a v e B s data " ; s u p e r (B, s e l f ).m( ) # C c l a s s C(A ) : d e f m( s e l f ) : " s a v e C s data " ; s u p e r (C, s e l f ).m( ) # A c l a s s D(B, C ) : d e f m( s e l f ) : " s a v e D s data " ; s u p e r (D, s e l f ).m( ) # B A. mro == (A, o b j e c t ) B. mro == (B, A, o b j e c t ) C. mro == (C, A, o b j e c t ) D. mro == (D, B, C, A, o b j e c t ) super(class, obj) nie musi być nadklasą class jest nadklasą obj. class obj musi być instancją pewnej podklasy class P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 20 / 48

Jak powstają metody? >>> class A(object):... def f(self): pass... >>> A. dict [ f ] <function f at 0x10be7f140> >>> A.f <unbound method A.f> >>> A().f <bound method A.f of < main.a object at 0x10bea10d0>> Funkcja ma metodę get (self, obj, objtype=none). >>> def g(self):pass... >>> g. get (None, A) <unbound method A.g> >>> g. get (A(), A) <bound method A.g of < main.a object at 0x10bea1250>> P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 21 / 48

Jak powstają metody? Zamiast funkcji możemy mieć dowolny obiekt, który ma metodę get. c l a s s RandFun ( o b j e c t ) : def init ( s e l f, a r g s ) : s e l f. f l i s t =a r g s def get ( s e l f, obj, o b j t y p e=none ) : r e t u r n random. c h o i c e ( s e l f. f l i s t ). get ( obj, o b j t y p e ) c l a s s A( o b j e c t ) : def f 1 ( s e l f ) : p r i n t " Jestem f 1 " def f 2 ( s e l f ) : p r i n t " Jestem f 2 " def g ( s e l f, v a l ) : p r i n t " Jestem g : "+s t r ( v a l ) r f=randfun ( f1, f 2 ) r f g=randfun ( f1, f2, f g ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 22 / 48

Deskryptory Obiekt implementujący co najmniej jedną z metod get (), set(), delete() nazywa się deskryptorem. c l a s s R e v e a l A c c e s s ( o b j e c t ) : def init ( s e l f, i n i t v a l =None, name= v a r ) : s e l f. v a l = i n i t v a l s e l f. name = name def get ( s e l f, obj, o b j t y p e ) : p r i n t R e t r i e v i n g, s e l f. name r e t u r n s e l f. v a l def set ( s e l f, obj, v a l ) : p r i n t Updating, s e l f. name s e l f. v a l = v a l c l a s s B( o b j e c t ) : x = R e v e a l A c c e s s ( 1 0, v a r " x " ) y = 5 P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 23 / 48

Deskryptory c.d. Deskryptory pozwalają na łatwą realizację kapsułkowania. property(fget=none, fset=none, fdel=none, doc=none) c l a s s C( o b j e c t ) : d e f g e t x ( s e l f ) : r e t u r n s e l f. x d e f s e t x ( s e l f, v a l u e ) : s e l f. x = v a l u e d e f d e l x ( s e l f ) : d e l s e l f. x x = p r o p e r t y ( getx, s e t x, d e l x, " I m the x p r o p e r t y. " ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 24 / 48

Metody statyczne Przy pomocy deskryptorów można zrealizować metody statyczne. c l a s s s t a t i c m e t h o d ( o b j e c t ) : d e f init ( s e l f, f ) : s e l f. f = f d e f get ( s e l f, obj, o b j t y p e=none ) : r e t u r n s e l f. f P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 25 / 48

... i klasowe c l a s s classmethod ( o b j e c t ) : d e f init ( s e l f, f ) : s e l f. f = f d e f get ( s e l f, obj, k l a s s=none ) : i f k l a s s i s None : k l a s s = type ( o b j ) d e f newfunc ( a r g s ) : r e t u r n s e l f. f ( k l a s s, a r g s ) r e t u r n newfunc P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 26 / 48

@dekoratory Metody statyczne (i klasowe) można tworzyć korzystając z klas staticmethod i classmethod. c l a s s A( o b j e c t ) : d e f f ( ) : pass s t a t i c=s t a t i c m e t h o d ( f ) d e f g ( c l s ) : pass g=classmethod ( g ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 27 / 48

@dekoratory c.d. Ale zazwyczaj stosuje się zapożyczoną z Javy składnię. c l a s s A( o b j e c t ) : @ s t a t i c m e t h o d def f ( ) : pass @ classmethod def g ( c l s ) : pass P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 28 / 48

@dekoratory c.d. Napis: @ d e k o r a t o r d ef f ( arg ) :... oznacza: d ef f ( arg ) :... f=d e k o r a t o r ( f ) Dekorator funkcji jest funkcją, która jako argument bierze funkcję dekorowaną i zwraca zmodyfikowaną funkcję. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 29 / 48

@dekoratory c.d. Przykład d ef bread ( f u n c ) : d e f wrapper ( ) : p r i n t " </ \ > " f u n c ( ) p r i n t "<\ />" r e t u r n wrapper d ef i n g r e d i e n t s ( f u n c ) : d e f wrapper ( ) : p r i n t "#tomatoes#" f u n c ( ) p r i n t "~ s a l a d ~" r e t u r n wrapper d ef sandwich ( food=" ham " ) : p r i n t food P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 30 / 48

@dekoratory c.d. Przykład sandwich ( ) #o u t p u t s : ham sandwich = bread ( i n g r e d i e n t s ( sandwich ) ) sandwich ( ) #o u t p u t s : #</ \ > # #tomatoes# # ham # ~ s a l a d ~ #<\ /> P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 31 / 48

@dekoratory c.d. @bread @ i n g r e d i e n t s d ef sandwich ( food=" ham " ) : p r i n t food sandwich ( ) #o u t p u t s : #</ \ > # #tomatoes# # ham # ~ s a l a d ~ #<\ /> P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 32 / 48

@dekoratory c.d. Kolejność ma znaczenie @ i n g r e d i e n t s @bread d ef strange_sandwich ( food=" ham " ) : p r i n t food strange_sandwich ( ) #o u t p u t s : ##tom ato es# #</ \ > # ham #<\ /> # ~ s a l a d ~ P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 33 / 48

@dekoratory przekazywanie argumentów d ef a_decorator_passing_arguments ( f u n c t i o n _ t o _ d e c o r a t e ) : d e f a_wrapper_accepting_arguments ( arg1, arg2 ) : p r i n t " I got a r g s! Look : ", arg1, arg2 f u n c t i o n _ t o _ d e c o r a t e ( arg1, arg2 ) r e t u r n a_wrapper_accepting_arguments @ a_ decorator_ passing_ arguments d ef print_full_name ( first_name, last_name ) : p r i n t "My name i s ", first_name, last_name print_full_name ( " P e t e r ", "Venkman" ) # o u t p u t s : #I got a r g s! Look : P e t e r Venkman #My name i s P e t e r Venkman Przy dekoratorach stosowanych do dowolnych funkcji używa się *args, **kwargs. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 34 / 48

@dekoratory przekazywanie argumentów do dekoratora d ef wrap_in_tag ( tag ) : d e f f a c t o r y ( f u n c ) : d e f d e c o r a t o r ( args, kwargs ) : r e t u r n <%(tag ) s>%(r v ) s </%(tag ) s> % ({ tag : tag, r v : f u n c ( args, kwargs ) } ) r e t u r n d e c o r a t o r r e t u r n f a c t o r y @wrap_in_tag ( b ) @wrap_in_tag ( i ) d ef say ( v a l ) : r e t u r n v a l p r i n t say ( h e l l o ) Funkcja wrap_in_tag zwraca dekorator, który dokłada do wyniku dekorowanej funkcji zadany tag XML. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 35 / 48

Klasy również można dekorować d ef addid ( o r i g i n a l _ c l a s s ) : o r i g _ i n i t = o r i g i n a l _ c l a s s. init d e f init ( s e l f, id, args, kws ) : s e l f. id = i d s e l f. g e t I d = g e t I d o r i g _ i n i t ( s e l f, args, kws ) o r i g i n a l _ c l a s s. init = init r e t u r n o r i g i n a l _ c l a s s @addid c l a s s Foo : pass P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 36 / 48

Konstruktory i inicjalizatory Metoda new new jest metodą statyczną, która jako pierwszy argument bierze klasę obiektu, który ma zostać stworzony. Pozostałe argumenty są przekazywane do inicjalizatora. Metoda init init jest wywoływana po new. Metoda call Tworząc klasę (np. A()) wywołujemy metodę call, która wywołuje po kolei new i init. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 37 / 48

Konstruktory i inicjalizatory - c.d. Przykład I n [ 1 ] : c l a s s A( o b j e c t ) :... : def init ( s e l f ) :... : s e l f. x = 1... : I n [ 2 ] : a1 = A( ) I n [ 3 ] : a1. x Out [ 3 ] : 1 I n [ 4 ] : a2 = A. new (A) I n [ 5 ] : a2 Out [ 5 ] : < main. A a t 0 x10434b750> P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 38 / 48

Konstruktory i inicjalizatory - c.d. Przykład I n [ 6 ] : a2. x A t t r i b u t e E r r o r Traceback ( most r e c e n t c a l l l a s t ) <i p y t h o n input 6 ecef1d046d23 > i n <module >() > 1 a2. x A t t r i b u t e E r r o r : A o b j e c t has no a t t r i b u t e x I n [ 7 ] : a2. init ( ) I n [ 8 ] : a2. x Out [ 8 ] : 1 P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 39 / 48

Metoda new c l a s s GimmeFive ( o b j e c t ) : d e f new ( c l s, args, kwargs ) : r e t u r n 5 Zastosowania 1 Tworzenie obiektu innej klasy. 2 Wykonanie operacji, które nie mogą zależeć od implementacji init w podklasach. P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 40 / 48

Metoda new - przykład c l a s s Operator ( o b j e c t ) : d e f new ( c l s, op, args, kwargs ) : i f op == + : r e t u r n s u p e r ( Operator, c l s ). new ( Add ) e l i f op == : r e t u r n s u p e r ( Operator, c l s ). new ( Mul ) d e f init ( s e l f, op, arg1, arg2 ) : s e l f. arg1 = arg1 s e l f. arg2 = arg2 c l a s s Add ( Operator ) : d e f e v a l ( s e l f ) : r e t u r n s e l f. arg1 + s e l f. arg2 c l a s s Mul ( Operator ) : d e f e v a l ( s e l f ) : r e t u r n s e l f. arg1 s e l f. arg2 P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 41 / 48

Metoda new - przykład I n [ 2 ] : op. Operator ( +, 3, 4) Out [ 2 ] : <op. Add at 0 x1071a5790> I n [ 3 ] : op. Operator ( +, 3, 4 ). e v a l Out [ 3 ] : <bound method Add. e v a l o f <op. Add o b j e c t at 0 x1071a5b90> I n [ 4 ] : op. Operator ( +, 3, 4 ). e v a l ( ) Out [ 4 ] : 7 I n [ 5 ] : op. Operator (, 3, 4 ). e v a l ( ) Out [ 5 ] : 12 P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 42 / 48

Metaklasy (Lasciate ogni speranza) Klasy są obiektami: klasy type new-style classes klasy types.classtype classic classes P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 43 / 48

Metaklasy (Lasciate ogni speranza) Klasy są obiektami: klasy type new-style classes klasy types.classtype classic classes W zasadzie nic nie stoi na przeszkodzie, aby klasy były obiektami dowolnej klasy (metaklasy). Jaki jest z tego pożytek? sianie zamętu i zniechęcenia kontrola tworzenia klasy (metody new i init ) kontrola tworzenia obiektów klasy (metoda call ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 43 / 48

Metaklasy c.d. Metaklasa danej klasy jest określona przez: atrybut metaclass metaklasa jednej z klas bazowych zmienna globalna metaclass types.classtype Tworzenie klasy skutkuje wywołaniem metaklasy: M( name, bases, d i c t ) gdzie: name nazwa klasy bases klasy bazowe dict elementy klasy P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 44 / 48

Metaklasy c.d. c l a s s Meta ( type ) : d e f init ( c l s, name, bases, d i c t ) : p r i n t " D e f i n i o w a n a k l a s a : ", c l s p r i n t "o nazwie : ", name p r i n t " d z i e d z i c z y z : ", b a s e s p r i n t "o elementach : ", d i c t type. init ( c l s, name, bases, d i c t ) d e f call ( c l s, args, kwargs ) : p r i n t " Tworze o b i e k t k l a s y : ", c l s r e t u r n type. call ( c l s, args, kwargs ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 45 / 48

Metaklasy c.d. I n [ 1 0 ] : c l a s s A( o b j e c t ) :.... : metaclass = Meta.... : d e f m( s e l f ) :.... : p r i n t " Jestem m".... : D e f i n i o w a n a k l a s a : <c l a s s main. A > o nazwie : A d z i e d z i c z y z : (<type o b j e c t >,) o elementach : { m : <f u n c t i o n m at 0 x10e3c0de8 >, module : I n [ 1 1 ] : A( ) Tworze o b i e k t k l a s y : <c l a s s main. A > Out [ 1 1 ] : < main. A at 0 x10e3b8e50> P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 46 / 48

Metaklasy c.d. Przykład automatyczne tworzenie properties c l a s s autoprop ( type ) : d e f init ( c l s, name, bases, d i c t ) : s u p e r ( autoprop, c l s ). init ( name, bases, d i c t ) p r o p s = {} f o r member i n d i c t. k e y s ( ) : i f member. s t a r t s w i t h ( "_get_" ) or member. s t a r t s w i t h ( "_set_" ) : p r o p s [ member [ 5 : ] ] = 1 f o r prop i n p r o p s. k e y s ( ) : f g e t = g e t a t t r ( c l s, "_get_%s " % prop, None ) f s e t = g e t a t t r ( c l s, "_set_%s " % prop, None ) s e t a t t r ( c l s, prop, p r o p e r t y ( f g e t, f s e t ) ) P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 47 / 48

Metaklasy c.d. Zastosowanie I n [ 2 9 ] : c l a s s A( o b j e c t ) :.... : metaclass = autoprop.... : d e f _get_x ( s e l f ) :.... : p r i n t "_get_x".... : r e t u r n a. x.... : d e f _set_x ( s e l f, x ) :.... : p r i n t "_set_x".... : s e l f. x = x.... : I n [ 3 0 ] : a = A( ) I n [ 3 1 ] : a. x = 5 set_x I n [ 3 2 ] : a. x get_x get_x Out [ 3 2 ] : 5 P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2014 48 / 48