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