Programowanie obiektowe cz 1

Programowanie obiektowe cz 1

Do przygotowania przed zajęciami

* Python dla każdego. Podstawy programowania. – Michael Dawson – Helion **R** – Rozdział 8. Wprowadzenie. Koniec gry.

Cel i tematyka zajęć

Dzisiejsze laboratorium ma na celu zapoznanie Państwa z następującymi zagadnieniami:
* podstawy programowania obiektowego,
* klasy,
* metody,
* obiekty.

– Zadanie przypominające

* Zapisz do pliku listę zawierającą imiona polskie 10 sztuk (np. Katarzyna, Marzena, Wiesław, Olgierd, Szymon, Joanna, Barbara, Łukasz, Krzysztof, Piotr) plik nazwij imiona.dat, w drugim pliku o nazwie nazwiska.dat pobierz od użytkownika do listy 10 nazwisk i zapisz do pliku nazwiska.dat następnie pobierz dane z pliku imiona.dat do listy imiona2 oraz pobierz dane z pliku nazwiska.dat do listy nazwiska2. Wykonaj losowanie elementu (pamiętaj, że indeksy w liście zaczynają się od 0) z listy imiona i z listy nazwiska i wyświetl wylosowane dane użytkownikowi. PODPOWIEDŹ: pobieranie informacji od użytkownika do listy było realizowane na laboratorium 4, zaś “konserwowanie list” przerabialiśmy na ostatnich zajęciach.

Programowanie obiektowe

Programowanie obiektowe choć uważane za skomplikowane to jedno z najczęściej i najchętniej używanych metod programowania.

Definiowanie klas

Klasy tak najogólniej mówiąc są pewnego rodzaju wzorcami na podstawie których możemy tworzyć obiekty. Klasa inaczej mówiąc jest definicją obiektu.
Poniżej widzicie Państwo definicję klasy – przykładowa klasa ma nazwę Critter – proszę zwrócić uwagę, że została ona napisana z dużej litery. W tym przypadku jak i w sytuacji stałych Python nie wymaga tego od programisty, ale jest to dobrym zwyczajem.

# demonstracja definiowania klasy

class Critter(object):
'''Wirtualny pupil'''

Definiowanie metody

Definiowanie metody bardzo przypomina definiowanie funkcji i na początku można myśleć, że metoda jest funkcją związaną z obiektem. Definiowanie metod wygląda następująco:

# demonstracja definiowania metody

class Critter(object):
'''Wirtualny pupil'''
def talk(self):
print("Cześć! Jestem egzemplarzem klasy Critter.")


**UWAGA** Jeśli tworząc metodę nie dodasz żadnych parametrów wygenerujesz błąd przy jej wywołaniu (w funkcji mogliśmy tworzyć je bez parametrów zaś w przypadku metod nie ma takiej możliwości). Metoda **MUSI** zawierać specjalny pierwszy parametr jakim jest self.

Konkretyzacja obiektu

Obiekt jest odwzorowaniem fizycznie istniejących elementów opisanych przez swój wzorzec czyli klasę. Możemy stworzyć wiele obiektów o różnych nazwach wykorzystujących ten sam wzorzec. Wyobraźmy sobie projekt domu (niech będzie on naszą klasą) na jego podstawie możemy wybudować wiele domów różniących się atrybutami np. kolorem elewacji, układem mebli, kolorem ścian w pomieszczeniu jednak zawsze będą to budynki oparte o ten sam projekt. Obiekty przypisujemy do zmiennej:

# demonstracja konkretyzacji obiektu

class Critter(object):
'''Wirtualny pupil'''
def talk(self):
print("Cześć! Jestem egzemplarzem klasy Critter.")

#main
cat = Critter()
dog = Critter()

Wywołanie metody

Każdy ze skonkretyzowanych wcześniej obiektów posiada metodę //talk()//. Możemy ją wywołać w następujący sposób

# demonstracja konkretyzacji obiektu

class Critter(object):
'''Wirtualny pupil'''
def talk(self):
print("Cześć! Jestem egzemplarzem klasy Critter.")

#main
cat = Critter()
dog = Critter()
cat.talk()
dog.talk()

Używanie konstruktorów

Umiemy już tworzyć metody takie jak talk(). Możemy zatem napisać specjalną metodę zwaną **konstruktorem** metoda taka wywoływana jest zawsze w momencie gdy tworzymy nowy obiekt. Konstruktory używane są zazwyczaj do nadawania wartości początkowych atrybutom obiektu. Konstruktor nazywany jest init. **Wszystkie** metody specjalne jak przytoczony tutaj konstruktor rozpoczynają się i kończą na dwóch -podkreśleniach.

# demonstracja zastosowania konstruktora

class Critter(object):
'''Wirtualny pupil'''
def __init__(self):
print("Urodził się nowy zwierzak!")
def talk(self):
print("Cześć! Jestem egzemplarzem klasy Critter.")


#main
cat = Critter()
dog = Critter()
cat.talk()
dog.talk()

Korzystanie z atrybutów

Poniżej przedstawiony kod tworzy obiekt z atrybutem name. Tak jak w przykładzie przytoczonym na początku ćwiczeń gdzie każdy budynek mial inny kolor. Tak w przypadku naszego programu każdy obiekt klasy //Critter()// będzie miał inne imię.

#demonstracja wykorzystania atrybutów

class Critter(object):
'''Wirtualny pupil'''
def __init__(self, name):
print("Urodził się nowy zwierzak!")
self.name = name
def __str__(self):
rep = "Obiekt klasy Critter\n"
rep += "name: " + self.name + "\n"
return rep
def talk(self):
print("Cześć! Jestem",self.name,"\n")

#main
cat = Critter("Bonifacy")
cat.talk()

dog = Critter("Reksio")
dog.talk()

Inicjalizacja atrybutów

Aby korzystać z atrybutów – musimy je zainicjalizować w konstruktorze klasy. Proszę zwrócić uwagę na konstruktor przedstawiony poniżej:

class Critter(object):
'''Wirtualny pupil'''
def __init__(self, name):
print("Urodził się nowy zwierzak!")
self.name = name

Pierwsza linijka konstruktora wyświetla komunikat o urodzeniu się nowego zwierzaka i ten fragment jest nam już znany z poprzednich programów, zaś w drugiej linijce pojawiła się nowa konstrukcja self.name – jednak aby ją dobrze zrozumieć należy wiedzieć czym jest self. Ten tajemniczy parametr jest pierwszym parametrem każdej metody, który jako swoją wartość otrzymuje referencję do obiektu który wywołał metodę. Dzięki temu parametrowi metoda może sięgać do atrybutów obiektu który ją wywołał. Czyli w naszym przykładzie metoda //talk()// może wypisać imię zwierzaka.

Korzystanie z atrybutów

Jeżeli chcemy uzyskać dostęp do atrybutu obiektu wykonujemy to za pomocą podania nazwy w naszych przykładach to np. cat lub dog robimy to następująco:

print(cat.name)
print(dog.name)

Taki sposób dostępu do atrybutu jest nazywany dostępem bezpośrednim.

Metody i atrybuty związane z klasą

Python umożliwia programiście tworzenie metod statycznych związanych z klasą a nie obiektem, tak samo jest w przypadku atrybutów – takie elementy znacząco ułatwiają życie programistom. Wyobraźmy sobie sytuację: chcemy wiedzieć ile stworzyliśmy już zwierząt na podstawie klasy Critter – możemy utworzyć atrybut total — jednak jeśli to będzie atrybut obiektu bardzo uciążliwym będzie aktualizowanie go we wszystkich stworzonych obiektach klasy Critter, w takim celu używamy atrybutu klasy. Tworzymy ją następująco:


# Zwierzak z klasą
# Demonstruje atrybuty klasy i metody statyczne

class Critter(object):
"""Wirtualny pupil"""
total = 0

@staticmethod
def status():
print("\nOgólna liczba zwierzaków wynosi", Critter.total)

def __init__(self, name):
print("Urodził się zwierzak!")
self.name = name
Critter.total += 1

#część główna
print("Uzyskanie dostępu do atrybutu klasy Critter.total:", end=" ")
print(Critter.total)

print("\nTworzenie zwierzaków.")
crit1 = Critter("zwierzak 1")
crit2 = Critter("zwierzak 2")
crit3 = Critter("zwierzak 3")

Critter.status()

print("\nUzyskanie dostępu do atrybutu klasy poprzez obiekt:", end= " ")
print(crit1.total)

Zadania do samodzielnego wykonania na laboratoriach

* przeanalizuj kod i omów go na zajęciach:

# Prosty zwierzak
# Demonstruje podstawową klasę i obiekt

class Critter(object):
"""Wirtualny pupil"""
def talk(self):
print("Cześć! Jestem egzemplarzem klasy Critter.")

# część główna
crit = Critter()
crit.talk()

input("\n\nAby zakończyć program, naciśnij klawisz Enter.")


* Stwórz własną klasę, która opisuje przeciwników dla gracza. Utwórz na jej podstawie 3 przeciwników. Atrybuty to: punkty życia, siła, zręczność, obrona, atak, obrażenia. Metody jakie powinna zawierać klasa to: atak, obrona.
* Utwórz konstruktor stworzonej wyżej klasy, który będzie informował o stworzeniu nowego przeciwnika.

– Przykłady używane na laboratoriach

Przykłady pochodzą z książki
* Podstawową książką wykorzystywaną na laboratorium będzie: „Python dla każdego. Podstawy programowania Wydanie III”, autor Michael Dawson, Wydawnictwo Helion **(R)**

Zadanie domowe

**Wszystkie zadania domowe należy archiwizować ponieważ w dalszej części laboratoriów będziecie je Państwo rozbudowywać**
* Stwórz klasę postaci gracza. Atrybuty jakie powinna zawierać klasa to: imię, rasa, punkty życia, obrona, siła, zręczność, budowa, inteligencja. Metody jakie powinna zawierać klasa to: dobądź broń wywołanie tejże ma wyświetlić napis: Dobyłeś broń.
* Stwórz konstruktor klasy informujący o stworzeniu postaci.
* Python dla każdego. Podstawy programowania. – Michael Dawson – Helion **R** – Rozdział 9.