Spis treści. The Zen of Python

Wielkość: px
Rozpocząć pokaz od strony:

Download "Spis treści. The Zen of Python"

Transkrypt

1 Spis treści 1 The Zen of Python 2 Szybkie wprowadzenie do obiektów i klas 2.1 Notacja obiektowa 2.2 Jak w Pythonie tworzy się nowe klasy? 3 Specjalne metody w Pythonie 3.1 Metoda init 3.2 Metoda str 3.3 Operatory dwuargumentowe 3.4 Inne funkcje specjalne 4 Życie obiektu 4.1 Stworzenie w wyniku wywołania klasy 4.2 Inicjalizacja zawartości obiektu 4.3 Życie obiektu 4.4 Śmierć obiektu 4.5 Przykład: historia życia dwóch obiektów 5 Przykład: kompletna definicja klasy Wektor 6 Dziedziecznie 6.1 Duck-typing 6.2 Wielodziedziczenie 6.3 Funkcja super 6.4 Stare i nowe klasy w Pythonie 2 7 Przestrzenie nazw 7.1 Przestrzeń nazw w funkcji 7.2 Przestrzeń nazw w module 7.3 Przestrzeń nazw w klasie i w obiekcie 7.4 Zagnieżdżenie przestrzeni nazw Zadanie Zadanie Zadanie Zadanie 4 8 Abstrakcyjne spojrzenie na programowanie obiektowe 8.1 Enkapsulacja (Kapsułkowanie bądź hermatyzacja) 8.2 Dziedziczenie Zasada podstawienia Liskov 8.3 Polimorfizm 8.4 Abstrakcja 8.5 Przykład 8.6 Uwaga dla programujących w innych językach The Zen of Python Wpisz w interpreterze Pythona

2 import this Programowanie obiektowe, czy szerzej programowanie zorientowane obiektowo, jest pewnym sposobem organizacji kodu. Pomysł polega na umieszczeniu kodu obsługującego dane blisko tych danych. W jakim sensie blisko? Nie fizycznej bliskości, czyli nie w sensie bliskiego umiejscowienia w pamięci, ani niekoniecznie w sensie blisko w tekście programu. Chodzi raczej o bliskość logiczną, podkreśloną przez wygodną notację. Co to wszystko dokładnie znaczy łatwiej będzie opisać po wprowadzeniu odpowiednich pojęć. Szybkie wprowadzenie do obiektów i klas Obiekt Zmienne przechowujące dane zawarte w obiekcie nazywa się polami, natomiast funkcje związane z obiektem, nazywa się metodami. Ważną cechą obiektów jest to, że dzielą się one na grupy charakteryzujące się podobnym zachowaniem. Wynika to z tego, że każdy obiekt ma swoją klasę, lub bardziej poprawnie gramatycznie, jest pewnej klasy. Klasa definiuje wspólne własności i zachowanie obiektów. Klasa zawiera funkcje przeznaczone do używania z obiektami tej klasy metody. Klasa jest opisem, definicją. Obiekt jest konkretną zmienną zbudowaną i zachowującą się zgodnie z definicją klasy. Gdy tworzymy zmienną i przypisując jej, powiedzmy, liczbę 5, to tworzymy obiekt o nazwie i, klasy int. i = 5 Notacja obiektowa Ważnym elementem używania obiektów jest notacja obiektowa. Do pól i metod obiektów dostajemy się pisząc nazwę zmiennej dowiązanej do obiektu, kropkę i nazwę atrybutu obiektu. Na przykład dla klasy list istnieje metoda append, która pozwala na dopisywanie elementów na końcu każdej listy. Wywołanie mojalista.append('rzecz') doda napis 'rzecz' na koniec listy mojalista. Jako przykład pól rozważmy liczbę: obiekt klasy int.

3 >>> a = 1 >>> print 'a = ', a.numerator, '/', a.denominator a = 1 / 1 >>> print 'a = ', a.real, ' + i * ', a.imag a = 1 + i * 0 >>> print 'a jest typu', a. class. name a jest typu int Jak widać, obiekt klasy int ma (przynajmniej) cztery pola licznik {{ang numerator i mianownik {{ang denominator oraz część rzeczywistą {{ang real i urojoną {{ang imaginary. Notację z kropką stosuje się tak samo by uzyskać dostęp do pól jak i do metod, bo tak naprawdę różnica między polami a metodami jest znacznie mniejsza niż się na pierwszy rzut oka wydaje. Jak w Pythonie tworzy się nowe klasy? Zacznijmy od przykładu: class Wektor(object): "Dwuwymiarowy wektor" def init (self, x, y): self.a = x self.b = y print "wektor został stworzony!" def dlugosc(self): "Zwraca długość wektora." return (self.a ** 2 + self.b ** 2) ** 0.5 w1 = Wektor(5, 7) # pisze: wektor został stworzony! print w1.dlugosc() # pisze: Jak to działa? Nasza nowa klasa Wektor ma dwie metody: Wektor. init i Wektor.dlugosc. Nazwa i znaczenie pierwszej z nich będzie wyjaśnione poniżej, na razie powiemy tylko, że jej zadaniem jest zapisanie odpowiednich wartości w polach obiektu i że zostaje ona wywołana automatycznie w momencie tworzenia obiektu. Natomiast funkcja dlugosc oblicza długość wektora korzystając ze zmiennych przechowywanych w polach wektora. Jak to zostało pokazane w przykładzie, dysponując obiektem, metodę można wywołać dzięki notacji z kropką. Zmienna self W definicji funkcji dlugosc podany jest jeden parametr self. Niemniej, w momencie

4 wywołania, piszemy w1.dlugosc(), nie podając żadnych argumentów. Wewnątrz metod, zmienna self odnosi się do samego obiektu. Dzięki temu możliwy jest dostęp do pól obiektu, np. self.a. W momencie wywołania metody obiektu, zostaje on automatycznie wstawiony jako pierwszy argument metody i użytkownik podaje o jeden mniej argument niż metoda wymaga. Specjalne metody w Pythonie Pewne funkcje zostają wywołane w sposób automatyczny. Aby podkreślić fakt, że dana funkcja może zostać wywołana automatycznie, mają one nazwy zaczynające i kończące się dwoma podkreśleniami. W Pythonie są trzy różne kategorie nazw zaczynających się od podkreślenia, ale tak naprawdę nie mają one ze sobą dużo wspólnego. Najważniejsze są właśnie funkcje wywoływane automatycznie opisanej powyżej, które mają po parze podkreśleń na początku i na końcu. Oprócz tego występują zmienne prywatne, zaczynające się od jednego lub dwóch podkreśleń. Ich przeznaczeniem jest przechowanie zmiennych, do których nie należy się bezpośrednio odwoływać spoza klasy czy modułu. Metoda init Ważną funkcją specjalną jest metoda init. Python sam wywołuje ją automatycznie kiedy tworzymy nowy obiekt danego typu. Programista nie musi podać nazwy funkcji do wywołania, bo interpreter wie, że do konstrukcji obiektu służy metoda o tej właśnie nazwie. W tym właśnie sensie metoda init jest specjalna. Metoda ta powinna wykonywać wszystkie operacje potrzebne do zainicjowania nowego obiektu, w szczególności powinna ona nadawać wartości jego polom. Pod innymi względami jest ona zupełnie zwyczajna, w szczególności można ją wywołać drugi i trzeci raz podając explicite jej nazwę (jeśli chcemy zmienić nasz wektor, na przykład wydłużyć dwa razy to możemy napisać w1. init (10, 14)). Metoda str Oprócz wcześniej wspomnianej metody init przydatna jest metoda str. Służy ona do wytwarzania tekstowej reprezentacji obiektu. Jest automatycznie wywoływana np. przez polecenie print. Można ją dodać do naszego przykładowego wektora i zostanie ona automatycznie użyta do uzyskania reprezentacji tekstowej wektora kiedy tylko zajdzie taka potrzeba. class Wektor(object): "Dwuwymiarowy wektor" def init (self, x, y): self.a = x self.b = y print "wektor został stworzony!" def dlugosc(self): "Zwraca długość wektora." return (self.a ** 2 + self.b ** 2) ** 0.5

5 def str (self): """Zwraca napis, reprezentację tekstową obiektu. Ta metoda jest wywoływana automatycznie, gdy ktoś napisze str(wektor) lub print wektor """ return "Wektor x={0.a} y={0.b}".format(self) w1 = Wektor(5, 7) print w1 # wypisuje: Wektor x=5 y=7 Operatory dwuargumentowe Operatory dwuargumentowe są kolejnym typem metod specjalnych. Ich nazwy zawierają po dwa znaki podkreślenia na początku i na końcu. Wywoływane są gdy w kodzie pomiędzy dwoma obiektami pojawia się symbol operatora, np. + Z każdym operatorem związana jest domyślna nazwa metody, która definiuje co programista przewidywał zrobić gdy np. dodawał do siebie dwa wektory Wracając do naszgo przykładowego Wektora: jeśli zechcemy dodać dwa Wektory korzystając ze znaku +, nie będzie to wykonalne, otrzymamy TypeError. Stanie się to możliwe dopiero kiedy napiszemy metodę add, czyli implementację operatora + dla klasy Wektor. Aby zrozumieć działanie operatora dwuargumentowego, trzeba wiedzieć, że Python po napotkaniu x+y wywołuje metodę x. add (y) (mówimy, że wykonanie operatora zostaje delegowane do metody). Zatem implementując operator dwuargumentowy musimy napisać funkcję, której pierwszym argumentem jest obiekt znajdujący się na lewo od operatora (jest to aktualny obiekt i mamy dostęp do niego przez self) zaś drugim argumentem jest obiekt znajdujący się na prawo od operatora. Poniżej prezentujemy przykład implementacji dodawania dla rozważnej klasy Wektor: class Wektor(object): # # dotychczasowy kod klasy wektor # def add (self, other): """Zwraca nowy wektor, sumę self i other. Ta metoda jest wywoływana automatycznie, gdy ktoś napisze w1 + w2 """ return Wektor(self.a + other.a, self.b + other.b) w1=wektor(5,7)

6 print w1 + w1 # wypisuje: Wektor x=10 y=14 Inne funkcje specjalne Funkcji specjalnych jest sporo, bo tabela operatorów jest długa, a należy pamiętać, że dochodzą jeszcze operatory skrócone +=, -=,... Każdy z nich ma odpowiadającą mu funkcję specjalną, którą można napisać by umożliwić wykonywanie tej operacji na obiektach danej klasy. Wszystkie funkcje specjalne są opisane w dokumentacji języka, W trakcie pracy w interaktywnym interpreterze przydatny jest moduł operator, który zawiera funkcje specjalne do arytmetyki na liczbach. Można skorzystać z jego dokumentacji, która zawiera opisy funkcji specjalnych do operacji matematycznych (import operator; help(operator)). Życie obiektu Stworzenie w wyniku wywołania klasy Aby stworzyć obiekt, trzeba wcześniej mieć klasę. Samo polecenie stworzenia obiektu wygląda identycznie jak wywołanie funkcji. W naszym przykładzie instancja_wektora = Wektor(11, -4) Inicjalizacja zawartości obiektu Bezpośrednio po utworzeniu obiektu, zmienne wewnątrz obiektu (pola) jeszcze nie istnieją. Dodanie ich do obiektu przez przypisanie im wartości jest zadaniem funkcji zwanych konstruktorami. Po stworzeniu obiektu zostają wywołane jego konstruktory, czyli metody new i init. W obiektach klas stworzonych przez użytkownika języka ich rola się dubluje, o pierwszej zapominamy, i należy używać tylko drugiej z nich. Przechodząc do inicjalizacji obiektu, następuje ona przez wywołanie funkcji init z argumentami przekazanymi przy wywołaniu klasy opisanym w poprzednim punkcie. Rozważmy szczegółowo inicjalizację Wektora wyrażeniem Wektor(11, -4). Powoduje to wywołanie funkcji Wektor. init z trzema argumentami: self nowo stworzony obiekt, jeszcze bez pól a 11, argument przekazany w wywołaniu b 4, argument przekazany w wywołaniu Na początku funkcji init nasz obiekt jest wydmuszką, która nawet nie ma swoich pól a i b. Ma jedynie metody zdefiniowane w klasie, ale nie można by ich użyć bo nie ma danych potrzebnych do ich wykonania. Ponieważ Wektor po prostu przechowuje podane wartości współrzędnych to są one zapisanywane do zmiennych self.a i self.b bez żadnej obróbki. Gdybyśmy chcieli nałożyć jakieś warunki, np. aby

7 wektor zawierał się w I ćwiartce, to w funkcji init powinniśmy dodać test na współrzędne i rzucić ValueError w wypadku gdy nasze żądania co do argumentów inicjalizujących Wektor nie zostały spełnione. Po zakończeniu działania funkcji init wektor ma nowo stworzone zmienne self.a i self.b, oraz metody init, dlugosc, i inne zdefiniowane w klasie. Metody są takie same dla każdego obiektu, są więc przechowywane w klasie, natomiast zmienne obiektu są przechowywane razem z nim, ze względu na to, że każdy wektor może mieć inne współrzędne. Taki podział działa automatycznie w ten sposób, że Python najpierw poszukuje atrybutu, pola lub metody, w obiekcie, a dopiero potem w jego klasie. Są też możliwe bardzie wyrafinowane przypisania pól i metod do obiektów, ale nie będziemy o nich tutaj pisać. [staticmethod, classmethod, funkcje w obiektach, zmienne klasowe] Życie obiektu Teraz obiekt jest gotowy do użycia. Aby było to możliwe, musi być przypisany do jakiejś zmiennej. Po tym jak żadne zmienne nie wskazują na obiekt, przestaje on być potrzebny i będzie później zniszczony. Innymi słowy, jeśli chcemy żeby nasz obiekt żył szczęśliwie, to musimy go mieć przypisanego przez cały czas do przynajmniej jednej zmiennej, dzięki temu wiemy, że nie zostanie zniszczony. Śmierć obiektu Python niszczy obiekty kiedy stają się niepotrzebne. Niepotrzebnym jest obiekt, który nie jest przypisany do żadnej nazwy. Obiekt ma wbudowany licznik referencji. Przypisanie obiektu do dowolnej zmiennej zwiększa ten licznik o 1, a usunięcie zmiennej (skasowanie zmiennej przez del, przypisanie do zmiennej innego obiektu lub zniknięcie zmiennej po zakończeniu funkcji) zmniejsza o 1. Obiekt żyje co najmniej tak długo, jak długo jego licznik referencji jest większy od 0. Zanim obiekt zostanie zniszczony, zostanie wywołana jego metoda del. Jej zadaniem jest wykonanie działań takich jak zamknięcie plików, które muszą być zamknięte wraz ze zniszczeniem obiektu. Niemniej, moment destrukcji obiektu jest trudny do przewidzenia, więc mechanizm del jest bardzo zawodny. Nie należy go używać. Przykład: historia życia dwóch obiektów Podstawą zrozumienia tego, jak to wszystko działa, jest to, że w Pythonie prawie wszystko jest obiektem. Zmienna jest nazwą, która wskazuje na obiekt, czyli mówiąc bardziej precyzyjnie, kluczem w pewnym słowniku wewnątrz Pythona (zwanym namespace), który wiąże nazwy z obiektami. Poniżej szczegółowo przedstawiona jest operacją przypisania dwóch zmiennych. Stwórzmy pierwszy obiekt (klasy Obiekt) i zachowajmy go w zmiennej nazwa. nazwa = Obiekt('niebieski')

8 Teraz przypiszmy obiektowi drugą nazwę. nowa_nazwa = nazwa Teraz stwórzmy nowy obiekt (klasy Obiekt) i zachowajmy go w zmiennej nazwa. nazwa = Obiekt('zielony') Teraz użyjmy operatora del. del nowa_nazwa Jak widać, operator del usuwa zmienną, nie obiekt na który ta zmienna wskazuje. Co się stanie z obiektem, na który wskazywała nazwa? W tym momencie jego licznik referencji {{ang reference count, czyli sposobów na który można dotrzeć do obiektu, wynosi 0. Obiekt zostanie niedługo zlikwidowany. Przykład: kompletna definicja klasy Wektor # -*- coding: utf-8 -*- class Wektor(object): """Dwuwymiarowy wektor.""" _ile_nas = def init (self, a, b): self.a = a self.b = b Wektor._ile_nas += 1 def dlugosc(self): """Zwraca liczbę, długość Wektora."""

9 return (self.a**2 + self.b**2)**0.5 def obroc(self): """Odwraca wektor w miejscu, czyli zamienia wartości jego współrzędnych na przeciwne. """ self.a *= -1 self.b *= -1 def obrocony(self): """Zwraca nowy wektor odwrócony.""" return Wektor(-self.a, -self.b) def str (self): """Zwraca reprezentację Wektora w formie (x, y)""" return "(" + str(self.a) + ", " + str(self.b) + ")" def repr (self): """Zwraca reprezentacje Wektora w formie <Wektor(x, return str (), id(self)) def add (self, other): """Zwraca nowy Wektor będący sumą self i other.""" print "dodawanie", self, other return Wektor(self.a + other.a, self.b + other.b) def dodawanie(self, other): """Zwraca nowy Wektor będący sumą self i other.""" print "dodawanie'", self, other return Wektor(self.a + other.a, self.b + other.b) def mul (self, other): """Zwraca liczbę będącą iloczynem skalarnym self i other.""" print "mnozenie", self, other return self.a * other.a + self.b * other.b def del (self): Wektor._ile_nas -= 1 Plik rozpoczyna się standardowym nagłówkiem informującym o kodowaniu dzięki temu możemy użyć polskie literki w napisach w programie bez ryzyka, że zostaną wyświetlone jako krzaczki pod innym systemem. Informacja o kodowaniu jest zapisana w komentarzu (zaczynającym się od #). Wszystkie nowe klasy powinny pochodzić od typu object lub innej klasy. Jeśli nie chcemy zmieniać

10 działania innej klasy tylko zacząć od zera to powinniśmy zrobić to tak jak w tym przykładzie. Na początku klasy, podobnie jak na początku funkcji, możemy dodać docstring. Ten napis zostanie wyświetlony jeśli ktoś napisze help(wektor). Dodamy zmienną klasową liczącą stworzone wektory. Ta zmienna, w przeciwieństwie do zwykłych pól, występuje tylko raz i jest przypisana do samej klasy, a nie obiektów tej klasy. Pozwala to na przechowywanie informacji wspólnych dla wszystkich obiektów, w tym wypadku ich całkowitej liczby. Metoda init ma za zadanie stworzyć pola obiektu. Aktualizujemy również licznik stworzonych wektorów. Metoda dlugosc wykorzystuje pola obiektu (self.a i self.b), aby wykonać niezbędne obliczenia i zwrócić długość wektora. Dwa sposoby wykonania operacji: w miejscu i ze stworzeniem nowego obiektu obroc zmienia obiekt obrocony tworzy nowy, stary pozostawiajac bez zmian Nazwy w formie niedokonanej i dokonanej są pewną konwencją podobnie sort sortuje listę zmieniając kolejność jej elementów, a sorted zwraca nowy obiekt z posortowanymi elementami. Metody str i repr wytwarzają napis będący reprezentacją Wektora zwięzłą, przeznaczoną do wypisywania wyników dla użytkownika, oraz nieco bardziej dokładną zawierającą informacje przydatne dla programisty. Dobrze, by repr zwracało napis pozwalający na skopiowanie i wykorzystanie jako fragment programu. Dwa sposoby wykonania operacji arytmetycznej: metoda o specjalnej nazwie wywoływana automatycznie przy wykonywaniu operacji +, oraz metoda wywoływana explicité przez podanie nazwy add pozwala na dodawanie dwóch Wektorów. Tworzony jest nowy obiekt. dodawanie robi dokładnie to samo, tylko sposób wywołania jest inny. Metoda mul realizuje mnożenie dwóch Wektorów. Metoda ta jest wywoływana automatycznie po użyciu operatora *. Wykorzystując różne obiekty można łatwo zrealizować mnożenie dla różnych typów. Niestety, jest tylko jeden operator mnożenia i nie można wygodnie zrealizować różnych mnożeń (np. wektorowego i skalarnego) dla jednego typu. Metoda del jest wywoływana automatycznie przy destrukcji obiektu. Normalnie nie jest specjalnie przydatna, ale tutaj używamy jej do aktualizacji licznika wystąpień obiektów tej klasy. Dziedziecznie

11

12 Dziedziczeniem nazywamy sytację, w której definiujemy nową klasę jako rozwinięcie istniejącej. Tę nową klasę nazywamy dzieckiem, a starą rodzicem. Jeszcze inne, alternatywne, nazewnictwo mówi o podklasach i nadklasach. Pochodzenie tych słów będzie wyjaśnione poniżej. Załóżmy, że mamy klasę B, która dziedziczy po klasie A. Dziedziczenie oznacza, że metody i pola dostępne w klasie-rodzicu A, są również dostępne w klasie-dziecku B. Innymi słowy, wszystkie obiekty klasy B mają takie same atrybuty jak obiekty klasy A. Powoduje to, że w ogólności, tam gdzie mogliśmy użyć obiektu klasy A, możemy również użyć obiektu klasy B. Oznacza to, że obiekty typu B są też obiektami typu A, czyli B jest podtypem czy też podklasą A. Symetrycznie, A jest nadklasą B. Sytuację kiedy obiektów dwóch różnych klas mają wspólny zestaw metod i pól i można je używać zamiennie nazywamy polimorfizmem. Polimorfizm jest częstszy, niż by się na pierwszy rzut oka mogło wydawać. Na przykład różne rodzaje liczb (klasy int, float czy complex) stosujemy w tym samym miejscu w zasadzie bez zastanowienia. Ponieważ możemy dodać dwie liczby zmienno-przecinkowe pisząc , to oczekujemy też, że podobna opercja będzie możliwa i da identyczny wynik jeśli za jedną z nich podstawimy liczbę całkowitą pisząć Polimorfizm jest ważny, gdyż znacznie ułatwia wykorzystanie obiektów różnych klas. Wygodniej jest myśleć o operacji dodawania zdefiniowanej dla wszystkich liczb, niż o opercji dodawania liczb zmienno-przecinkowych, operacji dodawania liczb całkowitych, operacji dodawania liczb zespolonych, itd. Dziedziczenie jest mechanizmem, który pozwala na uzyskanie polimorfizmu w bardzo łatwy sposób. Ponieważ klasy potomne na wstępie otrzymują komplet metod i pól rodzica, to możliwość podstawienia obiektu klasy dziecka za rodzica otrzymuje się automatycznie. Duck-typing W Pythonie dziedziczenie nie jest jednym sposobem na uzyskanie wymienności obiektów różnych klas. Tym co decyduje, jakiego typu obiekt możemy wykorzystać np. jako argument funkcji, nie jest jego klasa, tylko zestaw pól i metod obiektu wykorzystywanych w funkcji. Popatrzmy na przykład >>> class Hello(object):... def hello(self): return 'hello' >>> class Bye2(object):... def hello(self): return 'bye, bye' >>> def print_greeting(obj):... print type(obj), obj.hello() >>> print_greeting(hello()) <class ' main.hello'> hello >>> print_greeting(bye2()) <class ' main.bye2'> bye, bye

13 Mamy tutaj obiekty dwóch różnych klas, i przekazujemy je do tej samej funkcji print_greeting. Od obiektu przekazanego jako parametr, funkcja wymaga tylko tyle, by miał on metodę hello. Taki "leniwy polimorfizm" nazywa się {{ang duck-typing, co oznacza, że definiujemy klasy które niekoniecznie mają wspólnego przodka, a jedynie definiują wszystkie atrybuty potrzebne do wykonania danej operacji. Wielodziedziczenie W typowym przypadku, klasy które definiujemy mają jednego tylko rodzica. Niemniej, nie musi tak być. Jeśli podamy więcej niż jednego rodzica, to obiekty naszej nowej klasy odziedziczą atrybuty po wszystkich rodzicach. >>> class A(object):... def a(self):... print 'A' >>> class B(object):... def b(self):... print 'B' >>> class C(A, B):... def c(self):... print 'C' >>> c = C()

14 >>> c.a() A >>> c.b() B >>> c.c() C W przypadku gdy zażądamy dostępu do metody czy pola, które występuje tylko w jednym z rodziców, to sytuacja jest prosta przeszukiwany jest najpierw pierwszy rodzic, potem drugi,... dopóki nie natrafimy na atrybut o żądanej nazwie. W sytuacji kiedy zażądamy dostępu do atrybutu, dostępnego u więcej niż jednego rodzica, to decyduje kolejność dziedziczenia. W przykładzie powyżej, najpierw przeszukiwane jest C, potem A, potem B, a na końcu object. Wielodziedziczenie jest bardzo ciekawą techniką programistyczną, lecz niestety w praktyce w miarę skomplikowaną. Problemem jest to, że implementacje wszystkich klas w hierarchii muszą ze sobą współgrać. W szczególności, gdyby jeden z rodziców miał metodę o pewnej nazwie, a drugi z rodziców przypadkowo miałby pod taką samą nazwą zdefiniowaną metodę, która wykonuje zupełnie inną operację, to poprzez dziedziczenie po obydwu rodzicach, możemy np. doprowadzić do sytuacji, że omyłkowo wywołamy metodę z pierwszego rodzica chcąc wywołać metodę z pierwszego rodzica. Musimy sprawdzać nie tylko czy pożądana metoda jest zdefiniowana, ale przypadkiem również czy nie jest zdefiniowana inna metoda o tej samej nazwie. Takie ścisłe zespolenie różnych klas nie jest dobre, i często lepiej wykorzystać kompozycję zamiast (wielo-)dziedziczenia. Funkcja super Wiemy już, że jeśli zdefiniowaliśmy w klasie-dziecku metodę o danej nazwie, to zastępuje ona metodę o takiej samej nazwie zdefiniowaną w klasie-rodzicu. Niemniej, czasami chcielibyśmy wywołać metodę nadrzędną, czyli tą odziedziczoną po rodzicu. Możemy to zrobić na dwa sposoby: podając explicite nazwę klasy rodzica, lub wykorzystując funkcję super. To pierwsze rozwiązanie jest nieco prostsze, to drugie nieco lepsze. W pierwszym rozwiązaniu, do metody rodzicielskiej odwołujemy się tak samo jak do każdej innej funkcji, podając ścieżkę do niej.

15 >>> class Welcome(object):... def hello(self):... return 'Hello' >>> class WarmWelcome(Welcome):... def hello(self):... return Welcome.hello(self) + ", you're welcome" >>> print Welcome().hello() Hello >>> print WarmWelcome().hello() Hello, you're welcome W drugim rozwiązaniu, do metody rodzicielskiej odwołujemy się poprzez pomocniczy obiekt zwracany przez super. Funkcja super bieże dwa argumenty klasę od której zaczynamy poszukiwania (czyli generalnie klasę wewnątrz której definicji wywołujemy super) oraz argument self. Brzmi to trochę karkołomnie, ale w praktyce nie jest specjalnie skomplikowane. >>> class HeartyWelcome(Welcome):... def hello(self):... return super(heartywelcome, self).hello() + ", you're heartily welcome" >>> print HeartyWelcome().hello()

16 Hello, you're heartily welcome W takich prostych przypadkach jak ten, i jeden, i drugi sposób odwołania się do Welcome.hello będzie skuteczny. Można nawet powiedzieć, że pierwszy jest bardziej klarowny. Niemniej, ze względu na to, że w bardziej skomplikowanych przypadkach drugi jest lepszy, dla spójności (i celem wyrabiania dobrych nawyków), lepiej stosować ten drugi. Czym różnią się te dwa sposoby? Wykorzystując super podajemy nazwę bieżącej klasy. Wykorzystując bezpośrednie odwołanie podajemy nazwę klasy macierzystej. W przypadku gdy zmieniamy hierarchię dziedziczenia, np. czyniąc HeartyWelcome dzieckiem Welcome, nie musimy zmieniać wszystkich odwołań do odziedziczonych metod. Jeśli odwoływaliśmy się do metod rodzica przez super, to automatycznie zaczniemy się odwoływać do metod nowego rodzica. Jest to szczególnie ważne, gdy klasa-rodzic jest zdefiniowana w innym module. Wykorzystanie super zmniejsza prawdopodobieństwo pomyłek przy przerabianiu kodu. Po drugie, funkcja super zachowuje się w szczególny sposób w sytuacji wielokrotnego dziedziczenia (czyli w sytuacji, gdy dana klasa ma więcej niż jednego rodzica). O ile każda z metod w hierarchii wywołuje metodę "nadrzędną" przez super, to wszystkie metody w hierarchii zostaną wywołane w pewnym ściśle określonym porządku. >>> class A(object):... def init (self):... super(a, self). init ()... print 'init A'... >>> class B(object):... def init (self):... super(b, self). init ()... print 'init B'... >>> class C(A, B):... def init (self):... super(c, self). init ()... print 'init C'... >>> c = C() init B init A init C Zauważmy, że A. init wywołuje B. init, mimo że klasa A zupełnie nic o klasie B nie wie. Niemniej, z punktu widzenia klasy C, to by obydwoje jej rodzice zostali poprawnie zainicjalizowani, jest absolutnie kluczowe. Po trzecie, nie musimy przekazywać self jako pierwszego argumentu wywołania metody.

17 Oczywiście niewiele na tym zyskujemy, bo musimy przekazać self jako argument funkcji super. Możnaby pomyśleć, że takie przekazywanie oczywistych informacji, np. tego wewnątrz jakiej klasy metoda jest zdefiniowana, jest niepotrzebne i interpreter Pythona mógłby sam to stwierdzić. Tak się dzieje, ale dopiero w Pythonie 3. Piszemy po prostu super(). Stare i nowe klasy w Pythonie 2 Przykładowe klasy definiowane powyżej zawsze dziedziczą po czymś. Często jest to klasa object. Niemniej wydawałoby się, że to dziedzicznie nie jest do niczego potrzebne (bo faktycznie klasa object nie definiuje żadnych pól, a jedynie parę metod typu str, do których rzadko się odwołujemy z klas potomnych). Dziedziczenie po object jest potrzebne z innych przyczyn. W Pythonie 2 mamy dwa rodzaje klas tak zwane {{ang old-style classes oraz {{ang new-style classes. Te drugie otrzymujemy, gdy definiujemy klasy dziedziące bo object, bezpośrednio lub pośrednio, tak jak w przykładach w tym skrycie. Te pierwsze otrzymujemy, gdy definiujemy klasy gołe, nie dziedziczące po niczym, lub klasy dziedziczące po klasach starego typu. Klasy starego typu są reliktem historii i pochodzą z czasów, gdy klasy definiowane przez użytkownika tworzyły zupełnie oddzielną hierarchię od typów macierzystych języka. Ta dychotomia jest od dawna zniesiona, ale oba typy klas różnią się nieco zachowaniem, o czym poniżej, i ze względu na potrzebę zachowania poprawności działania istniejącego kodu, można definiować klasy zarówno starego jak i nowego typu. W Pythonie 3 klasy starego typu już nie istnieją. Z tego względu w Pythonie 3, niezależnie od tego, czy się w jawny sposób zadeklaruje dziedziczenie po object, czy też nie, takie dziedziczenie jest automatyczne i zawsze otrzymuje się klasę nowego typu. W przypadku klas starego i nowego typu, nieco inaczej zachowuje się operator super. Przy rekurencyjnych wywołaniach metody nadrzędnej, w klasach nowego typu przechodzimy wszystkich rodziców w pewnym porządku. W klasach starego typu możemy jednego rodzica odwiedzić więcej niż raz. [1] [2] W klasach nowego typu możemy definiować tzw. deskryptory. Deskryptory pozwalają na definiowanie specjalnego typu atrybutów. Dostęp do atrybutów zdefiniowanych przez deskryptory do których dostęp wygląda tak samo jak dostęp do zwykłych statycznych pól, ale faktycznie powoduje wywołanie metody na deskryptorze. Użycie deskryptora pozwala np. na zastąpenie zwykłego pola przez parę funkcji {{ang getter/{{ang setter, czyli np. dodanie sprawdzania poprawności wartości wstawianej do pola, bez zmiany sposobu dostępu do tego pola. Bywa to niezwykle wygodne w przypadku przerabiania kodu. Ta funkcjonalność jest opisana tutaj. Niemniej, deskryptory działają tylko w przypadku klas nowego typu. Podobnych drobnych niekompatybilności między klasami starego i nowego typu jest więcej. Generalnie, są one w miarę subtelne i naprawdę trudno jest je wszystkie pamiętać. Oznacza to, że jeśli nie chcemy mieć niespodzianek, powinniśmy zacisnąć zęby i zawsze dopisywać te osiem znaków potrzebnych po to, by definiować klasy nowego typu. Jako dodatkowy bonus, nasz kod jest znacznie łatwiej przerobić na Pythona 3, gdzie klasy nowego typu nazywają się po prostu klasami.

18 Przestrzenie nazw Zastanówmy się, czy możemy mieć więcej niż jedną zmienną o tej samej nazwie? Gdyby pod tą samą nazwą kryły się dwie różne rzeczy, to mielibyśmy problem. Z tego względu nasuwa się odpowiedz negatywna. Niemniej, żądanie, by nigdy nazw nie powtarzać, idzie bardzo daleko. Jeśli mamy dwie funkcje, i jeśli użyjemy zmiennej n w obydwu, to nie powinno być problemów. Chcielibyśmy móc odpowiedzieć 'tak!'. Rozwiązaniem problemu są przestrzenie nazw. Nazwy nie mogą się powtarzać wewnątrz jednej przestrzeni nazw, ale to ograniczenie nie dotyczy różnych przestrzeni nazw. Czym dokładnie są przestrzenie nazw i w jaki sposób i kiedy owe tworzymy? Przestrzeń nazw {{ang namespace tworzy po prostu odwzorowanie z nazw do obiektów. Jak każde odwzorowanie, również to oznacza, że jeśli mamy jakąś nazwę w naszym wyjściowym zbiorze zdefiniowanych nazw, to mamy jeden (i dokładnie jeden) odpowiadający jej obiekt. W Pythonie przestrzenie nazw są zaimplementowane po prostu jako słowniki, w których kluczami są napisy --- nazwy zmiennych --- a wartościami obiekty. Jak wiemy, klucze w słowniku nie mogą się powtarzać (czyli mamy jednoznaczność odzworowania) i jeśli jakiś klucz się w słowniku znajduje, to możemy uzyskać dostęp do odpowiadającej mu wartości (czyli odwzorowanie jest zapamiętane jako zestaw par klucz:wartość). Każda rzecz, która ma własną przestrzeń nazw, ma przypisany słownik, do którego interpreter zagląda szukając zmiennych. Każdy moduł ma swoją przestrzeń nazw. Każda klasa ma oddzielną przestrzeń nazw. Każdy obiekt ma swoją własną przestrzeń nazw. Każde wywołanie funkcji tworzy nową przestrzeń nazw. Przestrzeń nazw w funkcji Każda funkcja posiada własną przestrzeń nazw, nazywaną lokalną przestrzenią nazw, a która śledzi zmienne funkcji, włączając w to jej argumenty i lokalnie zdefiniowane zmienne. W momencie kiedy funkcja zaczyna wykonywanie, to w tej lokalnej przestrzeni nazw znajdują się tylko parametry określone w nagłówku funkcji. W miarę wykonywania funkcji, lokalnie zdefiniowane zmienne są dopisywane do tej przestrzeni nazw. Wraz z zakończeniem wykonywania funkcji ta przestrzeń nazw znika. Dostęp do najbardziej wewnętrzej przestrzeni nazw można uzyskać (pomijając bezpośrednie użycie zmiennych), poprzez funkcję locals. Funkcja ta zwraca słownik, który jest właśnie tym słownikiem który pamięta co lokalna przestrzeń nazw zawiera. Przestrzeń nazw w module Każdy moduł, czyli każdy pythonowy plik, posiada własną przestrzeń nazw. Na początku jest ona pusta, a w miarę wykonywania poleceń w pliku (czyli wczytywania definicji klas czy funkcji, a nie wykonywania tych funkcji!) odpowiednie nazwy są do niej dopisywane. Ostatecznie znajdują się w niej funkcje, klasy i inne zaimportowane moduły, a także zmienne zdefiniowane na poziomie modułu. Przestrzeń nazw w module jest nazywana globalną przestrzenią nazw, bo nazwy w niej zdefiniowane

19 są widoczne również w funkcjach i klasach zdefiniowanych wewnątrz, o czym za chwilę. Dostęp do przestrzeni nazw modułu można uzyskać poprzez funkcję globals. Przestrzeń nazw w klasie i w obiekcie Rozpoczęcie definicji klasy słowem class, tworzy również nową przestrzeń nazw. W zasadzie jest to przestrzeń nazw jak każda inna, i mogą się w niej znaleźć dowolne rzeczy, ale w praktyce są to głównie funkcje, a rzadziej zmienne klasowe, czyli zmienne wspólne dla wszystkich obiektów tej klasy. Po stworzeniu obiektu danej klasy, tworzymy również nową przestrzeń nazw dla tego indywidualnego obiektu. Żyje ona tak samo długo jak ten obiekt, i zostaje zniszczona razem z nim. Zagnieżdżenie przestrzeni nazw Gdybyśmy będąc w obrębie jednej przestrzeni nazw, na przykład w trakcie wykonywania funkcji, nie mogli w żaden sposób odwołać się do zmiennych zdefiniowanych w innych przestrzeniach nazw, na przykład dla modułu, to programowanie byłoby znacznie utrudnione. Okazuje się, że możemy uzyskać dostęp do innych przestrzeni nazw na dwa sposoby. Pierwszy z tych dwóch sposobów to automatyczne przeszukiwanie kilku przestrzeni nazw po kolei. W przypadku gdy zażądamy dostępu do obiektu pod pewną nazwą która nie istnieje w naszej lokalnej przestrzeni nazw, to interpreter poszuka nazwy w kilku innych miejscach. Przeszukiwane przestrzenie nazw w znacznej mierze odpowiadają porządkowi w jakim definiowane są moduły i funkcje w plikach. Jeśli funkcja jest zdefiniowana w jakimś module, to jej przestrzeń nazw jest zagnieżdzona w przestrzeni nazw modułu. Oznacza to, że jeśli użyjemy w tej funkcji nazwy która nie jest zdefiniowana w tej funkcji (albo jako zwykła zmienna, albo jako parametr), to również moduł zostanie sprawdzony pod kątem tej nazwy. Jeśli jakaś nazwa nie jest zdefiniowana ani w funkcji (czyli lokalnej przestrzeni nazw), ani w zawierającym tę funkcję module (czyli globalnej przestrzeni nazw), to sprawdzana jest jeszcze jedna przestrzeń nazw, a dokładnie jeszcze jeden moduł. Jest to moduł builtins, który zawiera wszystkie nazwy które są normalnie dostępne, takie jakie len, range, int, str, Exception,... Drugim sposobem na dostęp do różnych przestrzeni nazw jest bezpośrednie się do nich odwołanie przez użycie kropki, czyli tzw. notacji obiektowej. Jeśli np. mamy jakiś obiekt, to pisząc nazwaobiektu -- kropka -- nazwa-zmiennej, szukamy tej zmiennej w zmiennych zdefiniowanych dla tego obiektu. Oznacza to, że sprawdzamy zarówno słownik nazw dla tego obiektu, jak i dla jego klasy. Zadanie 1 Wyświetl w interpretrze globalną i lokalną przestrzeń nazw.

20 Zadanie 2 Za pomocą funkcji dir() wyświetl przestrzeń nazw modułu numpy. Zadanie 3 Dopisz zmienną xxx do lokalnej przestrzeni nazw poprzez operację bezpośrednio na słowniku zwracanym przez locals. Dopisz zmienną yyy do globalnej przestrzeni nazw poprzez operację bezpośrednio na słowniku zwracanym przez globals. Sprawdź, czy masz dostęp do zmiennych xxx i yyy. Zadanie 4 Zadeklaruj funkcję foo, która bierze jeden parametr (o nazwie arg) i w której zainicjowana zostanie zmienna x o wartości 1. W funkcji wypisz zawartość globalnej i lokalnej przestrzeni nazw. Abstrakcyjne spojrzenie na programowanie obiektowe Obiekty Abstrakcyjną ideą programowania obiektowego jest powiązanie stanu (danych, które określane są zwykle polami) i zachowania (algorytmy związane ze stanem i całym obiektem, określane słowem metody). Program korzystający z obiektowości wyrażony jest jako zbiór takich obiektów, komunikujących się pomiędzy sobą w celu wykonywania zadań. W pewien sposób jest to najbardziej intuicyjne podejście do rozwiązywania problemów, bo w taki sposób traktując zagadnienia jako obiekty wraz ze stanem i metodami; do rozwiązywania problemów podchodzi ludzki mózg. Typy obiektów nazywamy klasami. Klasa umożliwia zdefiniowanie tego "jak działa pies" (Rys. Figure 1) i wykorzystania tego w przypadku innych psów. Zresztą mówiąć "Burek jest psem", mówimy tak naprawdę, że "Obiekt Burek jest instancją klasy pies".

21 Enkapsulacja (Kapsułkowanie bądź hermatyzacja) Enkapsulacja polega na tym, że szczegóły implementacji są ukryte. Dzięki temu obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko wewnętrzne metody danego obiektu są uprawnione do zmiany jego stanu. Każdy typ obiektów ma swój interfejs, który określa dopuszczalne metody współpracy. Jesteśmy jakimś obiektem, dla ustalenia A. Widzimy drugi obiekt, B. Obiekt B wie o sobie wszystko, my wiemy o nim tylko tyle, ile on nam udostępnia. W szczególności nie mamy dostępu do wielu zmiennych tego obiektu, możemy natomiast go "poprosić" żeby coś zrobił z tymi zmiennymi, lub podał nam ich wartość, wywołująć metodę, jaką obiekt nam udostępnia. Analogia z życia: Idziemy do apteki, chcemy kupić jakiś lek nie bierzemy go z półki sami, tylko wywołujemy określoną metodę obiektu Apteka, prosząc Panią Sprzedawczynię, aby ten lek nam podała. Nie interesuje nas w jaki sposób ona to zrealizuje tzn czy będzie np. musiała poczukać go w magazynie, czy też wejść na stołek bo lek stoi na górnej półce. My tego sami robić nie musimy, to już nie nasz problem, leży to w gestii drugiego obiektu. Dziedziczenie Tworzenie nowej klasy na bazie klasy już istniejącej. Dziedziczenie korzysta z klasy, a także rozszerza ją. W przypadku zmiany funkcjonalności część metod można nadpisać nowymi. Tak, jak na Rys. Figure 1 klasy pies i owca dziedziczą po klasie Ssak. Mają na nowo zdefiniowane metody związane z dźwiękiem, który wydają, z szybkością biegania, a także odziedziczone i niezmienione metody zwracające kolor obiektu. Zasada podstawienia Liskov (wersja potoczna) To, co działa dla klasy ssak powinno także działać dla klasy pies. Polimorfizm Zapewń powszechny sposób użycia dla różnych klas z odpowiednim zachowaniem dla danej klasy. Przykłady: operatory matematyczne (np. +, - itp.) funkcja len(), którą można użyć i dla list i dla tablic Abstrakcja Przykład Spróbujmy opisać kawałek otaczającej nas rzeczywistości. W naszym otocze Jesteśmy na uczelni. Na

22 uczelni jest dużo studentów. Wszyscy studenci mają coś takiego jak Imię, Nazwisko oraz nr indeksu. Opiszmy to w pythonie: class Student: ''' ''' znizka_na_pkp = 50 # zmienna klasowa, wspolna dla wszystkich obiektow klasy Student def init (self, imie, nazwisko, nr_indeksu): # znaczenie specjalnego słówka self poznamy za chwilę, każda klasa musi zawierać specjalną metodę init () która jest zwana konstruktorem, służy do tworzenia obiektów danej klasy. # zmienne obiektow, przybierajace rozne wartosci dla konkretnych instancji self. imie = name # pole "prywatne" self. nazwisko = nazwisko self.nr_indeksu = nr_indeksu # pole "publiczne" def lubisz_studia(self): print "no nie wiem" def przedstaw_sie(self): print "Nazywam się ", self. imie, self. nazwisko def zmien_nazwisko(self, nazwisko): self. nazwisko = nazwisko Spróbujmy teraz opisać Dobrego Studenta. Dobry student, tak samo jak każdy inny, ma Imie, Nazwisko oraz nr_indeksu. Czym się wyróżnia dobry student spośród pozostałych studentów? Dla uproszczenia przyjmijmy, że dobry student ma stypendium. Dodatkowo, dobry student na pytanie czy lubi studia po chwili zastanowienia odpowie, że jednak tak. Zobaczmy jak to będzie wyglądało w pythonie: class DobryStudent(Student): # klasa dobry student dziedziczy po klasie Student, bo jest jej uszczegółowieniem def init (self, imie, nazwisko, nr_indeksu, stypendium): Student. init (self, imie, nazwisko, nr_indeksu) # pierw tworzymy zwykłego studenta self.stypendium = stypendium # potem wzbogacamy go o stypendium def lubisz_studia(self): Student.lubisz_studia(self) # zastanawia się chwilę, jak każdy student print "raczej tak" # ale dodaje, że lubi studia

23 Teraz spróbujmy opisać Złego Studenta. Dla uproszczenia niech zły student to będzie taki, który powtarza rok. class ZlyStudent(Student): def init (self, imie, nazwisko, nr_indeksu, aktualnie_powtarzany_rok): Student. init (self, imie, nazwisko, nr_indeksu) self.aktualnie_powtarzany_rok = aktualnie_powtarzany_rok def lubisz_studia(self): Student.lubisz_studia(self) # wacha się chwilę jak każdy student print "studia sa do chrzanu" # w przeciwieństwie do dobrego studenta odpowiada, że nie lubi studiów To pobawmy się teraz chwilę tymi obiektami: s = Student("jan", "kowalski", "222") print s. imie # widzimy, że takie odwołanie nie jest możliwe, gdyż umowilismy sie, ze imie jest zmienna prywatna # i nie chcemy, zeby ktos je zmienial poza klasa s.przedstaw_sie() print s.nr_indeksu s.nr_indeksu = s. nazwisko = "Kowalski" Teraz zobaczmy, gdzie tu są podstawowe cechy programowania obiektowego: Enkapsulacja: nie odwołujemy się sami bezpośrednio do pól imie, nazwisko, tylko prosimy studenta, żeby się przedstawił. Dziedziczenie: DobrzyStudenci i ŹliStudenci są uszczegółowieniem Studenta. Polimorfizm l = [] l.append(dobrystudent("jan", "kowalski", "222")) l.append(zlystudent("zly", "student", "111")) for s in l: s.lubisz_studia() Utworzylismy listę studentów przemiszanych dobrych i złych. Mimo że nie wiemy do jakiego w

24 danej chwili studenta trzymamy referencję, jeśli wywołamy dowolną metodę, jaką ten student ma zaimplementowaną, to wywoła się właśnie ta metoda. Uwaga dla programujących w innych językach W Pythonie polimorfizm jest tak naturalny, że nawet się tego nie zauważa. W językach silnie typowanych przedstawia się trochę bardziej skomplikowanie i jest silnie związany z dziedziczeniem. W Javie, żeby zilustrować polimorfizm, musięlibysmy tworzyć referencje do obiektów klasy Student, i wskazywać tą referencją na obiekt klasy DobryStudent/ ZlyStudent i cieszylibyśmy się, że wywołanie metody lubisz_studia wywoluje metodę obiektu klasy DobryStudent/ZlyStudent a nie nadklasy, czyli Student. W C++ musięlibysmy metodę lubisz_studia zadeklarować jako wirtualną, żeby osiągnąć ten efekt. W Pythonie wszystkie metody zachowują się jak wirtualne.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Metody statyczne i klasowe Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk (Wydział Fizyki) PO w. VI Jesień 2013 1 / 23 W poprzednich odcinkach... Klasy kategorie obiektów Przynależność

Bardziej szczegółowo

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

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu. Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody

Bardziej szczegółowo

Programowanie obiektowe - 1.

Programowanie obiektowe - 1. Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która

Bardziej szczegółowo

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

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji). Dekoratory są w miarę ezoteryczną cechą Pythona w przeciwieństwie do funkcji, klas czy iteratorów nie są powszechną cechą języków programowania. Niemniej, warto je omówić mimo wszystko, gdyż są niezwykle

Bardziej szczegółowo

Technologie i usługi internetowe cz. 2

Technologie i usługi internetowe cz. 2 Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1 Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania,

Bardziej szczegółowo

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik

Bardziej szczegółowo

Podstawy Programowania Obiektowego

Podstawy Programowania Obiektowego Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja

Bardziej szczegółowo

Interfejsy i klasy wewnętrzne

Interfejsy i klasy wewnętrzne Interfejsy i klasy wewnętrzne mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Interfejs klasy sposób komunikacji z jej obiektami (zestaw składowych publicznych). Określa on zestaw

Bardziej szczegółowo

Wykład 5: Klasy cz. 3

Wykład 5: Klasy cz. 3 Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu

Bardziej szczegółowo

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej. Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.

Bardziej szczegółowo

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

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r. Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r. Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to

Bardziej szczegółowo

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost; Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze

Bardziej szczegółowo

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody Obiektowy PHP Czym jest obiekt? W programowaniu obiektem można nazwać każdy abstrakcyjny byt, który programista utworzy w pamięci komputera. Jeszcze bardziej upraszczając to zagadnienie, można powiedzieć,

Bardziej szczegółowo

Rozdział 4 KLASY, OBIEKTY, METODY

Rozdział 4 KLASY, OBIEKTY, METODY Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej

Bardziej szczegółowo

Wykład 8: klasy cz. 4

Wykład 8: klasy cz. 4 Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.

Bardziej szczegółowo

TEMAT : KLASY DZIEDZICZENIE

TEMAT : KLASY DZIEDZICZENIE TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą

Bardziej szczegółowo

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów

Bardziej szczegółowo

Deklaracja struktury w C++

Deklaracja struktury w C++ Struktury to złożone typy danych pozwalające przechowywać różne informacje. Za pomocą struktur możliwe jest grupowanie wielu zmiennych o różnych typach w jeden obiekt. Strukturę można nazywać obiektem

Bardziej szczegółowo

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

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Object-oriented programming Najpopularniejszy obecnie styl (paradygmat) programowania Rozwinięcie koncepcji programowania strukturalnego

Bardziej szczegółowo

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

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018 Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy

Bardziej szczegółowo

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

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np Klasy Klasa jest nowym typem danych zdefiniowanym przez użytkownika Wartości takiego typu nazywamy obiektami Najprostsza klasa jest po prostu strukturą, np struct Zespolona { Klasy jako struktury z operacjami

Bardziej szczegółowo

Przeciążanie operatorów

Przeciążanie operatorów Instrukcja laboratoryjna nr 4 Programowanie w języku C 2 (C++ poziom zaawansowany) Przeciążanie operatorów dr inż. Wilk-Jakubowski Jacek mgr inż. Lasota Maciej dr inż. Kaczmarek Tomasz Wprowadzenie Oprócz

Bardziej szczegółowo

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz

Bardziej szczegółowo

Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1

Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1 Rachunek Prawdopodobieństwa i Statystyka lab 3. Kaja Gutowska (Kaja.Gutowska@cs.put.poznan.pl) 1. Funkcje: - Funkcje nie powinny korzystać ze zmiennych globalnych. - Funkcje powinny być możliwie krótkie.

Bardziej szczegółowo

JAVA W SUPER EXPRESOWEJ PIGUŁCE

JAVA W SUPER EXPRESOWEJ PIGUŁCE JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie

Bardziej szczegółowo

Metody getter https://www.python-course.eu/python3_object_oriented_programming.php 0_class http://interactivepython.org/runestone/static/pythonds/index.html https://www.cs.auckland.ac.nz/compsci105s1c/lectures/

Bardziej szczegółowo

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja

Bardziej szczegółowo

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

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static), Tworzenie obiektów Dostęp do obiektów jest realizowany przez referencje. Obiekty w języku Java są tworzone poprzez użycie słowa kluczowego new. String lan = new String( Lancuch ); Obszary pamięci w których

Bardziej szczegółowo

Dokumentacja do API Javy.

Dokumentacja do API Javy. Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu

Bardziej szczegółowo

C++ Przeładowanie operatorów i wzorce w klasach

C++ Przeładowanie operatorów i wzorce w klasach C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje

Bardziej szczegółowo

10. Programowanie obiektowe w PHP5

10. Programowanie obiektowe w PHP5 Ogólnie definicja klasy wygląda jak w C++. Oczywiście elementy składowe klasy są zmiennymi PHP, stąd nieśmiertelne $. Warto zauważyć, że mogą one mieć wartość HHH mgr inż. Grzegorz Kraszewski TECHNOLOGIE

Bardziej szczegółowo

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

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego: Typy klasowe (klasy) 1. Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która definiuje programy za pomocą obiektów

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Języki i techniki programowania Ćwiczenia 2

Języki i techniki programowania Ćwiczenia 2 Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...

Bardziej szczegółowo

Do czego służą klasy?

Do czego służą klasy? KLASY Dorota Pylak 2 Do czego służą klasy? W programowaniu obiektowym posługujemy się obiektami. Obiekty charakteryzują się: cechami (inaczej - atrybutami lub stanami) operacjami, które na nich można wykonywać

Bardziej szczegółowo

Klasy abstrakcyjne i interfejsy

Klasy abstrakcyjne i interfejsy Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie

Bardziej szczegółowo

PHP 5 język obiektowy

PHP 5 język obiektowy PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje

Bardziej szczegółowo

Podstawy Języka Java

Podstawy Języka Java Podstawy Języka Java Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania, w którym programy definiuje się za pomocą obiektów elementów łączących

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia. Wprowadzenie teoretyczne.

Bardziej szczegółowo

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

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016 Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal

Bardziej szczegółowo

Dziedziczenie. Tomasz Borzyszkowski

Dziedziczenie. Tomasz Borzyszkowski Dziedziczenie Tomasz Borzyszkowski Podstawy Zobacz: Dziedzictwo1.java Dziedzictwo2.java Dziedziczenie jest jedną z podstawowych cech OOP ponieważ umożliwia łatwe implementowanie klasyfikacji hierarchicznych.

Bardziej szczegółowo

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

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? 1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie

Bardziej szczegółowo

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Java - tablice, konstruktory, dziedziczenie i hermetyzacja Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja

Bardziej szczegółowo

Definiowanie własnych klas

Definiowanie własnych klas Programowanie obiektowe Definiowanie własnych klas Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Definiowanie własnych klas Autor:

Bardziej szczegółowo

Listy, krotki, słowniki, funkcje

Listy, krotki, słowniki, funkcje Listy, krotki, słowniki, funkcje Listy Lista jest najbardziej elastycznym typem obiektu uporządkowanej kolekcji. Może zawierać różne typy danych - liczby, łańcuchy znaków, a nawet inne listy. Tworzy się

Bardziej szczegółowo

Mechanizm dziedziczenia

Mechanizm dziedziczenia Mechanizm dziedziczenia Programowanie obiektowe jako realizacja koncepcji ponownego wykorzystania kodu Jak przebiega proces dziedziczenia? Weryfikacja formalna poprawności dziedziczenia Realizacja dziedziczenia

Bardziej szczegółowo

Materiały do zajęć VII

Materiały do zajęć VII Spis treści I. Klasy Materiały do zajęć VII II. III. Konstruktor Właściwości i indeksatory Klasy Programowanie obiektowe wiadomości wstępne Paradygmat programowania obiektowego Abstrakcja Hermetyzacja

Bardziej szczegółowo

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

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class

Bardziej szczegółowo

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C #import "Fraction.h" #import @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator:

Bardziej szczegółowo

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe i C++ dla matematyków Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 22 XI 2011 Uwaga! Ponieważ już sobie powiedzieliśmy np. o wskaźnikach i referencjach, przez które nie chcemy przegrzebywać

Bardziej szczegółowo

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE. C++ - DZIEDZICZENIE Do najważniejszych cech języka C++ należy możliwość wielokrotnego wykorzystywania kodu Prymitywnym, ale skutecznym sposobem jest kompozycja: deklarowanie obiektów wewnątrz innych klas,

Bardziej szczegółowo

Programowanie strukturalne i obiektowe. Funkcje

Programowanie strukturalne i obiektowe. Funkcje Funkcje Często w programach spotykamy się z sytuacją, kiedy chcemy wykonać określoną czynność kilka razy np. dodać dwie liczby w trzech miejscach w programie. Oczywiście moglibyśmy to zrobić pisząc trzy

Bardziej szczegółowo

Aplikacje w środowisku Java

Aplikacje w środowisku Java Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - dziedziczenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 W ramach poprzedniego laboratorium

Bardziej szczegółowo

Aplikacje w środowisku Java

Aplikacje w środowisku Java Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - wprowadzenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 Klasa zbiór pól i metod Obiekt

Bardziej szczegółowo

.NET Klasy, obiekty. ciąg dalszy

.NET Klasy, obiekty. ciąg dalszy .NET Klasy, obiekty ciąg dalszy Przeciążanie operatorów 1 W języku C# istnieje możliwość zdefiniowania funkcjonalności dużej części operatorów dla typów stworzonych przez użytkownika. Dzięki takiemu zabiegowi,

Bardziej szczegółowo

Wstęp do programowania obiektowego. Wykład 2

Wstęp do programowania obiektowego. Wykład 2 Wstęp do programowania obiektowego Wykład 2 1 CECHY I KONCEPCJA PROGRAMOWANIA OBIEKTOWEGO 2 Cechy programowania obiektowego Dla wielu problemów podejście obiektowe jest zgodne z rzeczywistością (łatwe

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE WSKAŹNIKI KLASOWE Wskaźniki klasowe Każdy obiekt zajmuje fragment pamięci i wszystkie obiekty tego samego typu zajmują fragmenty pamięci tej samej długości początek miejsca w pamięci zajmowanego przez

Bardziej szczegółowo

Kurs rozszerzony języka Python

Kurs rozszerzony języka Python Wykład 2. 13 października 2017 Plan wykładu Klasy i obiekty 1 Klasy i obiekty 2 3 4 Plan wykładu Klasy i obiekty 1 Klasy i obiekty 2 3 4 Deklaracja klasy Klasy i obiekty Przykłady class Figura: Pierwsza

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Laboratorium 3 i 4 - przypomnienie wiadomości o OOP na przykładzie Javy mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 8 marca 2017 1 / 20 mgr inż. Krzysztof Szwarc

Bardziej szczegółowo

Modelowanie i Programowanie Obiektowe

Modelowanie i Programowanie Obiektowe Modelowanie i Programowanie Obiektowe Wykład I: Wstęp 20 październik 2012 Programowanie obiektowe Metodyka wytwarzania oprogramowania Metodyka Metodyka ustandaryzowane dla wybranego obszaru podejście do

Bardziej szczegółowo

Programowanie obiektowe - zadania

Programowanie obiektowe - zadania Programowanie obiektowe - zadania Elementy języka Java Zad.1. Napisz program, który sprawdza, czy dana liczba całkowita jest parzysta. Zad.2. Napisz program, który sumuje dane dwie liczby tylko w przypadku,

Bardziej szczegółowo

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie

Bardziej szczegółowo

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie

Bardziej szczegółowo

Czym są właściwości. Poprawne projektowanie klas

Czym są właściwości. Poprawne projektowanie klas Z akcesorów get i set korzysta każdy kto programuje w C#. Stanowią one duże udogodnienie w programowaniu obiektowym. Zapewniają wygodę, bezpieczeństwo i znacząco skracają kod. Akcesory są ściśle związane

Bardziej szczegółowo

ZASADY PROGRAMOWANIA KOMPUTERÓW

ZASADY PROGRAMOWANIA KOMPUTERÓW POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.

Bardziej szczegółowo

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

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego Iwona Kochaoska Programowanie Obiektowe Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych,

Bardziej szczegółowo

4. Funkcje. Przykłady

4. Funkcje. Przykłady 4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni

Bardziej szczegółowo

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji

Bardziej szczegółowo

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. Część XVII C++ Funkcje Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. 2 3 Tworzymy deklarację i definicję funkcji o nazwie pobierzln() Funkcja

Bardziej szczegółowo

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object Java: kilka brakujących szczegółów i uniwersalna nadklasa Object Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU Konstrukcja obiektów Niszczenie obiektów i zwalnianie zasobów

Bardziej szczegółowo

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

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop. 2017 Spis treści Przedmowa 11 1. Jak w programie 21 Czym jest program? 21 Uruchamianie interpretera języka Python 22 Pierwszy

Bardziej szczegółowo

Lab 9 Podstawy Programowania

Lab 9 Podstawy Programowania Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany

Bardziej szczegółowo

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02 METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się

Bardziej szczegółowo

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty

Bardziej szczegółowo

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

Spis treści. Dekoratory. 1 Dekoratory 1.1 Zadanie Zadanie Zadanie Zadanie 4 Spis treści 1 Dekoratory 1.1 Zadanie 1 1.2 Zadanie 2 1.3 Zadanie 3 1.4 Zadanie 4 Dekoratory Dekoratory w Pythonie służą do zastępowania zdefiniowanych przez nas funkcji przez funkcje (lub inne obiekty)

Bardziej szczegółowo

7. Pętle for. Przykłady

7. Pętle for. Przykłady . Pętle for Przykłady.1. Bez użycia pętli while ani rekurencji, napisz program, który wypisze na ekran kolejne liczby naturalne od 0 do pewnego danego n. 5 int n; 6 cin >> n; 8 for (int i = 0; i

Bardziej szczegółowo

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych

Bardziej szczegółowo

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

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki zaprojektowany jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych jest to język pozwalający na programowanie zarówno proceduralne

Bardziej szczegółowo

private - oznacza, że wszystkie elementy klasy bazowej zmieniają się w prywatne.

private - oznacza, że wszystkie elementy klasy bazowej zmieniają się w prywatne. C++/Dziedziczenie 1 C++/Dziedziczenie Wstęp - Co to jest dziedziczenie Często podczas tworzenia klasy napotykamy na sytuację, w której klasa ta powiększa możliwości innej klasy, nierzadko precyzując jednocześnie

Bardziej szczegółowo

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Podstawy algorytmiki i programowania - wykład 4 C-struktury 1 Podstawy algorytmiki i programowania - wykład 4 C-struktury Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com Jerzy

Bardziej szczegółowo

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python Język PYTHON Podstawowe informacje Python to język skryptowy, interpretowany - co oznacza, że piszemy skrypt, a następnie wykonujemy go za

Bardziej szczegółowo

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this Wstęp do programowania obiektowego WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this 1 Nazwa typu Rozmiar Zakres Uwagi bool 1 bit wartości true albo false stdbool.h TYPY ZNAKOWE

Bardziej szczegółowo

Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/

Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Paweł Rajba pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Spis treści Wprowadzenie Automatyczne ładowanie klas Składowe klasy, widoczność składowych Konstruktory i tworzenie obiektów Destruktory i

Bardziej szczegółowo

OBIEKTY PHP. G. Panuś

OBIEKTY PHP. G. Panuś OBIEKTY PHP G. Panuś Podstawowym elementem programowania obiektowego jest klasa Klasa zawiera Zmienne właściwości Klasa Funkcje metody Definiowanie klasy Do definiowania klasy służy polecenie class class

Bardziej szczegółowo

Oracle PL/SQL. Paweł Rajba.

Oracle PL/SQL. Paweł Rajba. Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 8 Wprowadzenie Definiowanie typu obiektowego Porównywanie obiektów Tabele z obiektami Operacje DML na obiektach Dziedziczenie -

Bardziej szczegółowo

Informatyka II. Laboratorium Aplikacja okienkowa

Informatyka II. Laboratorium Aplikacja okienkowa Informatyka II Laboratorium Aplikacja okienkowa Założenia Program będzie obliczał obwód oraz pole trójkąta na podstawie podanych zmiennych. Użytkownik będzie poproszony o podanie długości boków trójkąta.

Bardziej szczegółowo

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy wykład 2, część 1 1 Język JAVA podstawy Plan wykładu: 1. Rodzaje programów w Javie 2. Tworzenie aplikacji 3. Tworzenie apletów 4. Obsługa archiwów 5. Wyjątki 6. Klasa w klasie! 2 Język

Bardziej szczegółowo

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe 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

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Język programowania Ruby Marcin Młotkowski 12 kwietnia 2018 Plan wykładu 1 Wstęp 2 Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy

Bardziej szczegółowo

Informatyka I: Instrukcja 4.2

Informatyka I: Instrukcja 4.2 Informatyka I: Instrukcja 4.2 1 Wskaźniki i referencje - bezboleśnie Nauczyliśmy się do tej pory, że funkcje w języku C mogą zwracać wartość. Co jednak, gdybyśmy chcieli napisać funkcję, która rozwiąże

Bardziej szczegółowo

Argumenty wywołania programu, operacje na plikach

Argumenty wywołania programu, operacje na plikach Temat zajęć: Argumenty wywołania programu, operacje na plikach Autor: mgr inż. Sławomir Samolej Zagadnienie 1. (Zmienne statyczne) W języku C można decydować o sposobie przechowywania zmiennych. Decydują

Bardziej szczegółowo

Język C++ Programowanie obiektowe

Język C++ Programowanie obiektowe Język C++ Programowanie obiektowe Cechy programowania obiektowego abstrakcyjne typy danych hermetyczność obiektów (kapsułkowanie) dziedziczenie polimorfizm Programowanie proceduralne vs. programowanie

Bardziej szczegółowo

Podstawy technologii WWW

Podstawy technologii WWW Podstawy technologii WWW Ćwiczenie 11 PHP, MySQL: więcej, więcej!, więcej!!. tabel i funkcjonalności. Na dzisiejszych zajęciach zdefiniujemy w naszej bazie kilka tabel powiązanych kluczem obcym i zobaczymy,

Bardziej szczegółowo

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Tablice (jedno i wielowymiarowe), łańcuchy znaków Tablice (jedno i wielowymiarowe), łańcuchy znaków wer. 8 z drobnymi modyfikacjami! Wojciech Myszka Katedra Mechaniki i Inżynierii Materiałowej 2017-04-07 09:35:32 +0200 Zmienne Przypomnienie/podsumowanie

Bardziej szczegółowo

Programowanie i projektowanie obiektowe

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 Klasy w implementacji

Bardziej szczegółowo