Programowanie i projektowanie obiektowe

Podobne dokumenty
Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

Programowanie obiektowe

Programowanie i projektowanie obiektowe

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

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

Kurs rozszerzony języka Python

Programowanie i projektowanie obiektowe

Klasy abstrakcyjne, interfejsy i polimorfizm

Diagramy klas. dr Jarosław Skaruz

Programowanie obiektowe

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

Wstęp do programowania

Programowanie i projektowanie obiektowe

Technologie i usługi internetowe cz. 2

Programowanie i projektowanie obiektowe

Oracle PL/SQL. Paweł Rajba.

Programowanie obiektowe

Programowanie obiektowe

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

Programowanie obiektowe - 1.

Kurs WWW. Paweł Rajba.

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

Dziedziczenie. dr Jarosław Skaruz

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

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

Programowanie obiektowe

Metaprogramowanie w Ruby

Programowanie Obiektowe i C++

Podstawy Programowania Obiektowego

Programowanie obiektowe w VB cz 2


Paweł Kurzawa, Delfina Kongo

Programowanie obiektowe

Programowanie Obiektowe i C++

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

Programowanie obiektowe w języku

PHP 5 język obiektowy

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Programowanie obiektowe

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Programowanie, część I

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

Programowanie w Ruby

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

Dziedziczenie w Javie

Podstawy Języka Java

10. Programowanie obiektowe w PHP5

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

Podstawy programowania. Wykład PASCAL. Wstęp do programowania obiektowego. dr Artur Bartoszewski - Podstawy programowania, sem.

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

Programowanie obiektowe

Programowanie Obiektowe i C++ Marcin Benke

Programowanie Obiektowe i C++

Wykład 8: klasy cz. 4

1 Atrybuty i metody klasowe

Wstęp do programowania obiektowego. Wykład 2

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

Python! Lekcja 1 podstawy języka, typy danych

Obiektowy Caml. Paweł Boguszewski

Zaawansowany kurs języka Python

Technologie obiektowe

Programowanie Obiektowe i C++

Dokumentacja do API Javy.

Programowanie w Ruby

Definicje klas i obiektów. Tomasz Borzyszkowski

Programowanie w Ruby

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

Programowanie obiektowe

Spis treści. The Zen of Python

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

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

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

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Wprowadzenie do systemów informacyjnych

Polimorfizm. dr Jarosław Skaruz

Inne podejścia obiektowe. Referat na seminarium magisterskie Zagadnienia Programowania Obiektowego Dymitr Pszenicyn

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Wstęp do programowania

Modelowanie danych, projektowanie systemu informatycznego

Dziedziczenie. Tomasz Borzyszkowski

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

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

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

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

Wywoływanie metod zdalnych

C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści

Zagadnienia (1/3) Data-flow diagramy przepływów danych ERD diagramy związków encji Diagramy obiektowe w UML (ang. Unified Modeling Language)

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie w Ruby

Podstawy programowania w Pythonie

Programowanie w Ruby

Wykład 1. Projektowanie efektywnych algorytmów przetwarzania danych w sieciowych systemach usług, rzeczy i multimediów.

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie Obiektowe i C++

Transkrypt:

Programowanie i projektowanie obiektowe Python od środka Paweł Daniluk Wydział Fizyki Jesień 2016 P. Daniluk(Wydział Fizyki) PO w. VIII Jesień 2016 1 / 26

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. VIII Jesień 2016 2 / 26

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. VIII Jesień 2016 3 / 26

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. VIII Jesień 2016 4 / 26

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. VIII Jesień 2016 5 / 26

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. VIII Jesień 2016 6 / 26

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. VIII Jesień 2016 7 / 26

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. VIII Jesień 2016 8 / 26

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. VIII Jesień 2016 9 / 26

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. VIII Jesień 2016 10 / 26

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. VIII Jesień 2016 11 / 26

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. VIII Jesień 2016 12 / 26

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. VIII Jesień 2016 13 / 26

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. VIII Jesień 2016 14 / 26

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. VIII Jesień 2016 15 / 26

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. VIII Jesień 2016 16 / 26

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. VIII Jesień 2016 16 / 26

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. VIII Jesień 2016 17 / 26

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. VIII Jesień 2016 18 / 26

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. VIII Jesień 2016 18 / 26

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. VIII Jesień 2016 19 / 26

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. VIII Jesień 2016 19 / 26

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. VIII Jesień 2016 20 / 26

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. VIII Jesień 2016 21 / 26

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. VIII Jesień 2016 22 / 26

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. VIII Jesień 2016 23 / 26

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. VIII Jesień 2016 24 / 26

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. VIII Jesień 2016 25 / 26

... 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. VIII Jesień 2016 26 / 26