Programowanie i projektowanie obiektowe

Transkrypt

Programowanie i projektowanie obiektowe
Programowanie i projektowanie obiektowe
Obiekty i klasy w Pythonie
Paweł Daniluk
Wydział Fizyki
Jesień 2016
P. Daniluk (Wydział Fizyki)
PO w. III
Jesień 2016
1 / 21
Klasy i obiekty
Obiekty są instancjami klas.
Klasy w implementacji
odpowiadają klasom
projektowym.
P. Daniluk (Wydział Fizyki)
PO w. III
Jesień 2016
2 / 21
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ń 2016
2 / 21
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ń 2016
2 / 21
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ń 2016
2 / 21
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ń 2016
2 / 21
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ń 2016
3 / 21
Atrybuty
W Pythonie atrybuty obiektów działają podobnie jak zmienne. Tworzymy
je przez pierwsze przypisanie.
P. Daniluk (Wydział Fizyki)
PO w. III
Jesień 2016
4 / 21
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ń 2016
4 / 21
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ń 2016
4 / 21
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ń 2016
5 / 21
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ń 2016
6 / 21
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ń 2016
7 / 21
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ń 2016
8 / 21
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ń 2016
9 / 21
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ń 2016
10 / 21
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.
P. Daniluk (Wydział Fizyki)
PO w. III
Jesień 2016
11 / 21
Ograniczenia dostępu
Składowe o nazwach zaczynających się od znaków “__” są “prywatne” w
specyficzny sposób.
Wewnątrz definicji klasy identyfikator postaci “__ident” jest zamieniany
na “_Klasa__ident’’
P. Daniluk (Wydział Fizyki)
PO w. III
Jesień 2016
12 / 21
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ń 2016
13 / 21
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ń 2016
14 / 21
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ń 2016
15 / 21
Duck typing
P. Daniluk (Wydział Fizyki)
PO w. III
Jesień 2016
16 / 21
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ń 2016
16 / 21
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ń 2016
17 / 21
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ń 2016
17 / 21
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ń 2016
18 / 21
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ń 2016
19 / 21
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ń 2016
20 / 21
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ń 2016
21 / 21