Programowanie i projektowanie obiektowe
Transkrypt
Programowanie i projektowanie obiektowe
Programowanie i projektowanie obiektowe Obiekty i klasy w Pythonie Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 1 / 23 Klasy i obiekty Obiekty są instancjami klas. Klasy w implementacji odpowiadają klasom projektowym. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 2 / 23 Klasy i obiekty Klasy w implementacji odpowiadają klasom projektowym. Obiekty są instancjami klas. Przynależność do klasy określa zakres odpowiedzialności obiektów. Każdy obiekt należy do pewnej klasy. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 2 / 23 Klasy i obiekty Klasy w implementacji odpowiadają klasom projektowym. Obiekty są instancjami klas. Przynależność do klasy określa zakres odpowiedzialności obiektów. Każdy obiekt należy do pewnej klasy. Klasa określa funkcjonalności (metody) obiektów. Każdy obiekt odpowiada za wartości swoich atrybutów. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 2 / 23 Klasy i obiekty Klasy w implementacji odpowiadają klasom projektowym. Obiekty są instancjami klas. Przynależność do klasy określa zakres odpowiedzialności obiektów. Każdy obiekt należy do pewnej klasy. Klasa określa funkcjonalności (metody) obiektów. Każdy obiekt odpowiada za wartości swoich atrybutów. Metody określone przez klasę odwołują się do atrybutów przechowywanych w obiekcie. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 2 / 23 Klasy i obiekty Klasy w implementacji odpowiadają klasom projektowym. Obiekty są instancjami klas. Przynależność do klasy określa zakres odpowiedzialności obiektów. Każdy obiekt należy do pewnej klasy. Klasa określa funkcjonalności (metody) obiektów. Każdy obiekt odpowiada za wartości swoich atrybutów. Metody określone przez klasę odwołują się do atrybutów przechowywanych w obiekcie. Czy klasy mogą być obiektami? P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 2 / 23 Najprostszy obiekt class A: pass Klasa A nie ma żadnych metod, ale może mieć atrybuty. >>> a=A ( ) >>> a . x 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 "<s t d i n >" , l i n e 1 , i n <module> A t t r i b u t e E r r o r : A i n s t a n c e h a s no a t t r i b u t e ’ x ’ >>> a . x=1 >>> a . x 1 >>> P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 3 / 23 Atrybuty W Pythonie atrybuty obiektów działają podobnie jak zmienne. Tworzymy je przez pierwsze przypisanie. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 4 / 23 Atrybuty W Pythonie atrybuty obiektów działają podobnie jak zmienne. Tworzymy je przez pierwsze przypisanie. Czy to oznacza, że nie można określić w definicji klasy zakresu odpowiedzialności za przechowywanie danych? P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 4 / 23 Atrybuty W Pythonie atrybuty obiektów działają podobnie jak zmienne. Tworzymy je przez pierwsze przypisanie. Czy to oznacza, że nie można określić w definicji klasy zakresu odpowiedzialności za przechowywanie danych? Dobre pytanie... P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 4 / 23 Metody Metody są definiowane w klasach. c l a s s Lew : def t a l k ( s e l f ) : p r i n t " Jest e m ␣ l e w " >>> l=Lew ( ) >>> l . t a l k ( ) Je st e m l e w >>> P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 5 / 23 Metody Metody są definiowane w klasach. c l a s s Lew : def t a l k ( s e l f ) : p r i n t " Jest e m ␣ l e w " Definicja metody jest podobna do definicji funkcji. Pierwszy argument (self) jest obligatoryjny... P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 6 / 23 Metody Definicja metody jest podobna do definicji funkcji. Pierwszy argument (self) jest obligatoryjny... ... i służy do odwoływania się do obiektu, dla którego metoda została wywołana. >>> l=Lew ( ) >>> l . t a l k ( ) Jestem lew >>> l . s e t H u n g r y ( True ) >>> l . t a l k M o r e ( ) Jestem lew glodny lew >>> def s e t H u n g r y ( s e l f , v a l ) : s e l f . h u n g r y=v a l def t a l k M o r e ( s e l f ) : s e l f . talk () i f s e l f . hungry : p r i n t " glodny ␣ lew " Oczywiście do atrybutu hungry możemy również dostawać się bezpośrednio. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 7 / 23 Inicjalizacja Na początku lew jest popsuty. >>> l=Lew ( ) >>> l . t a l k M o r e ( ) Jest em l e w T r a c e b a c k ( most r e c e n t c a l l F i l e "<s t d i n >" , l i n e 1 , i n F i l e "<s t d i n >" , l i n e 9 , i n A t t r i b u t e E r r o r : Lew i n s t a n c e last ): <module> talkMore h a s no a t t r i b u t e ’ h u n g r y ’ Metoda __init__ def __init__ ( s e l f ) : s e l f . h u n g r y=F a l s e P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 8 / 23 Dziedziczenie c l a s s GroznyLew ( Lew ) : def t a l k M o r e ( s e l f ) : s e l f . talk () p r i n t " g r o z n y ␣ lew , " p r i n t " s p o t k a c ␣ mnie ␣ z n a c z y ␣ pech . " i f s e l f . hungry : p r i n t " W s z y s t k i c h ␣ zjem , ␣ az ␣ do ␣ dna . " p r i n t " Rety , ␣ l e p i e j ␣ n i e ␣ s p o t k a c ␣ l wa . " Metoda talk jest zdefiniowana jest w klasie Lew. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 9 / 23 Dziedziczenie >>> g l=GroznyLew ( ) >>> g l . t a l k ( ) Jest em l e w >>> g l . s e t H u n g r y ( True ) >>> g l . t a l k M o r e ( ) Jest em l e w g r o z n y lew , s p o t k a c mnie z n a c z y pech . W s z y s t k i c h zjem , az do dna . Rety , l e p i e j n i e s p o t k a c lwa . P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 10 / 23 Ograniczenia dostępu W Pythonie nie ma możliwości określania poziomu dostępności metod i atrybutów. Są dobrowolne konwencje Składowe o nazwach zaczynających się od znaku “_” są uznawane za niedostępne publicznie i/lub zależne od implementacji. W szczególności nie należy zakładać, że w kolejnych wersjach programów pozostaną niezmienone. Składowe o nazwach zaczynających się od znaków “__śą “prywatne” w specyficzny sposób. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 11 / 23 Ograniczenia dostępu c l a s s Lew : ... d e f __talkMore ( s e l f ) : s e l f . talk () i f s e l f . hungry : p r i n t " glodny ␣ lew " def talkMore ( s e l f ) : s e l f . __talkMore ( ) def talkMore ( s e l f ) : s e l f . __talkMore ( ) def t a l k S a f e ( s e l f ) : s e l f . __talkMore ( ) P. Daniluk (Wydział Fizyki) c l a s s GroznyLew ( Lew ) : d e f __talkMore ( s e l f ) : s e l f . talk () p r i n t " g r o z n y ␣ lew , " p r i n t " s p o t k a c ␣ mnie ␣ z n i f s e l f . hungry : p r i n t " Wszystkich ␣ p r i n t " Rety , ␣ l e p i e def talkMean ( s e l f ) : s e l f . __talkMore ( ) PO w. III Jesień 2013 12 / 23 Ograniczenia dostępu >>> l=Lew ( ) >>> l . t a l k M o r e ( ) Jestem lew glodny lew >>> l . t a l k S a f e ( ) Jestem lew glodny lew P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 13 / 23 Ograniczenia dostępu >>> g l=GroznyLew ( ) >>> g l . t a l k M o r e ( ) Jestem lew g r o z n y lew , s p o t k a c mnie z n a c z y pech . W s z y s t k i c h zjem , az do dna . Rety , l e p i e j n i e s p o t k a c l w a . >>> g l . t a l k S a f e ( ) Jestem lew glodny lew >>> g l . t a l k M e a n ( ) Jestem lew g r o z n y lew , s p o t k a c mnie z n a c z y pech . W s z y s t k i c h zjem , az do dna . Rety , l e p i e j n i e s p o t k a c l w a . >>> P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 14 / 23 Duck typing When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck. Na zmienną można przypisać referencję do dowolnego obiektu. Próba odwołania się do nieistniejącej składowej skutkuje błędem wykonania. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 15 / 23 Duck typing c.d. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 16 / 23 Duck typing c.d. Zalety Można używać w jednym kontekście obiektów nie mających wspólnej nadklasy zawierającej wymagane składowe. Nie trzeba stosować rzutowań, interfejsów, typów generycznych ani wzorców. Łatwiejsze projektowanie. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 16 / 23 Duck typing c.d. Zalety Można używać w jednym kontekście obiektów nie mających wspólnej nadklasy zawierającej wymagane składowe. Nie trzeba stosować rzutowań, interfejsów, typów generycznych ani wzorców. Łatwiejsze projektowanie. Wady Proste błędy (np. literówki), mogłyby zostać wykryte na etapie kompilacji. Ścisły system typów zabezpiecza przed podawaniem niewłaściwych argumentów itp. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 16 / 23 Python quirks – metoda __init__ Metoda __init__ nie jest konstruktorem. Jeżeli podczas inicjalizacji podklasy ma zostać wywołana metoda __init__ z nadklasy, trzeba to zrobić wprost. B a s e C l a s s . __init__ ( s e l f , [ a r g s . . . ] ) P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 17 / 23 Python quirks – metody to funkcje >>> l=Lew ( ) >>> l . t a l k M o r e ( ) Je st e m l e w >>> Lew . t a l k M o r e ( l ) Je st e m l e w >>> Lew . s e t H u n g r y ( l , True ) >>> Lew . t a l k M o r e ( l ) Je st e m l e w glodny lew >>> P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 18 / 23 Python quirks – argumenty metod/funkcji Domyślne wartości d e f __init__ ( s e l f , h u n g r y=True ) : ... P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 19 / 23 Argumenty nazwane d e f p a r r o t ( v o l t a g e , s t a t e= ’ a ␣ s t i f f ’ , a c t i o n= ’ voom ’ , t y p e= ’ N o r w e g i a n ␣ B l u e ’ ) : p r i n t "−−␣ T h i s ␣ p a r r o t ␣ wouldn ’ t " , a c t i o n , p r i n t " i f ␣ you ␣ p u t " , v o l t a g e , " v o l t s ␣ t h r o u g h ␣ i t . " p r i n t "−−␣ L o v e l y ␣ plumage , ␣ t h e " , t y p e p r i n t "−−␣ I t ’ s " , s t a t e , " ! " parrot (1000) # 1 p o s i t i o n a l argument p a r r o t ( v o l t a g e =1000) # 1 keyword argument p a r r o t ( v o l t a g e =1000000 , a c t i o n= ’VOOOOOM’ ) # 2 keyword a r g s p a r r o t ( a c t i o n= ’VOOOOOM’ , v o l t a g e =1000000) # 2 keyword a r g s p a r r o t ( ’ a ␣ m i l l i o n ’ , ’ b e r e f t ␣ o f ␣ l i f e ’ , ’ jump ’ ) # 3 p o s i t i o n a l arguments p a r r o t ( ’ a ␣ t h o u s a n d ’ , s t a t e= ’ p u s h i n g ␣ up ␣ t h e ␣ d a i s i e s ’ ) # 1 p o s i t i o n a l , 1 keyword P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 20 / 23 Zadanie 1 – Kostka Zadanie Zaimplementuj klasę Kostka z gry w Monopol. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 21 / 23 Zadanie 2 – Zwierzaki Zadanie Puść wodze fantazji, zaprojektuj i zaimplementuj hierarchię klas opisującą zwierzęta domowe. Zaimplementuj funkcje opisujące opiekę nad nimi. Zademonstruj mechanizm duck typing. Sprawdź, jak kończy się próba wydojenia kury. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 22 / 23 Zadanie 3 – Figury geometryczne Zadanie Utwórz hierarchię klas służącą do przechowywania informacji o figurach geometrycznych (kwadrat, prostokąt, koło, trójkąt) pozwalającą na wykonywanie następujących operacji (tam gdzie to możliwe): obliczanie obwodu i pola, obliczanie długości najdłuższego boku, obliczanie promienia okręgu opisanego na figurze, wypisywanie informacji. P. Daniluk (Wydział Fizyki) PO w. III Jesień 2013 23 / 23