Programowanie obiektowe zagościło, na dobre, po spopularyzowaniu języka C++. Jest to klasyczny przykład programowania opartego na obiektach, tuż obok języka Java.
Programowanie obiektowe, nie jest niezbędne, aby czerpać przyjemność z programowania oraz realizować wiele ciekawych projektów, JEDNAK otwiera nam ono zupełnie nowe horyzonty, jak i również ułatwia opanowanie, niektórych, ciekawych bibliotek i frameworków.
Poniżej znajdują się główne aspekty programowania obiektowego w języku Python oraz proste przykłady obrazujące działanie tych mechanizmów. Zaczynajmy !
Całość tematyki programowania obiektowego, jest z byt obszerna, aby pomieścić ją w jednej lekcji. A przynajmniej było by to nieefektywne, dla tego też, podzieliliśmy ją na kilka. Na końcu każdej, jest zestaw ćwiczeń, utrwalający wiedzę z przerabianej lekcji, natomiast później, napiszemy prosty program, który to wszystko łączy w całość.
Zanim zaczniemy programować, zastanówmy się nad jedną rzeczą.
Jaki problem rozwiązuje programowanie obiektowe?
Pod naszą lupą, postawmy człowieka.
Każdego człowieka, można w gigantycznym uproszczeniu, opisać następująco:
- wiek
- imię
- płeć
Jaki tym zmiennej, pomógł by nam przy przechowywaniu danych na temat konkretnego człowieka, lub ludzi?
W przypadku zmiennych typu liczba czy tekst, sprawa była prosta. Przechowują jedną, konkretną wartość. Ale tutaj mamy do czynienia z trzema wartościami. Potencjalnie, można by było zrobić, listę, w której, każdy element również był by listą, trzymającą te wartości. Co mogło by wyglądać następująco, jeżeli chcieli byśmy przechować informację o 3 osobach:
ludzie = [ [45,’Mike’, 'mężczyzna’] , [30,’Iza’,’kobieta’] , [2,’Adrian’, 'mężczyzna] ]
Chwilowo rozwiązaliśmy nasz problem. Jednak człowiek, oprócz tego, że ma przypisane do siebie wartości wiek, imię, płeć, może wykonywać również różne funkcje. Jak np.:
- może się przywitać
- może się ruszać
- może myśleć
Czyli mamy, już nie tylko zmienne, ale również funkcje – przywitaj, ruszaj, myśl.
A każdy człowiek, mówi, rusza się oraz myśli trochę inaczej, tak więc jak przechować te 3 funkcje dla każdego człowieka?
Jeżeli chcieli byśmy wykorzystać typy danych, i zmienne, które poznaliśmy do tej pory, zaczęło wy się robić skomplikowanie. I tutaj do gry wkracza programowanie obiektowe.
Czym jest programowanie obiektowe.
Jest to programowanie, w którego DNA znajduje się definiowanie obiektów, odpowiadających najczęściej obiektom ze świata rzeczywistego, posiadających swój stan oraz operacje, które na obiekcie wykonać można.
Zupełnie jak nasz człowiek:
Obiekt: człowiek
stan: wiek, imię, płeć
operacje: przywitaj(), rusza(), myśl()
To, na co pozwala nam programowanie obiektowe, to między innymi definiowanie nowych typów danych, a dokładnie klas. Czyli umożliwia nam na stworzenie nowego typu danych – człowieka, który może przechowywać to czego potrzebujemy.
Definiowanie takiego typu danych, nazywa się tworzeniem klasy. Natomiast w momencie, w którym na podstawie naszego nowego typu danych, czyli naszej klasy, utworzymy już konkretne zmienne, odpowiadające, naszym trzem osobom, to będzie mieć do czynienia z obiektami..
To wszystko, może brzmieć na zagmatwane, ale spójrzmy, jak to wygląda w rzeczywistości, a szybko okaże się, że w dużej mierze jest to kwestia zapoznania się z nowymi pojęciami.
Programowanie obiektowe w Python
Definiowanie klasy:
Klasa, w języku Python, która definiuje wyżej wspomnianego człowieka, może wygląda następująco:
class czlowiek: imie = "" wiek = None plec = "" def przywitaj(self): print ("Cześć. Mam na imię", self.imie) def ruszaj(self): if self.plec == "kobieta": print ("Ruszyłam w drogę") else: print ("Ryszyłem w drogę") def mysl(self): if self.wiek < 2: print ("Dopiero się ucze") else: print ("Nie ma problemu")
Cała definicja, zaczyna się od słowa kluczowego – ’class’, następnie jest nazwa naszej klasy oraz znak „:„.
Wewnątrz naszej klasy, znajduje się definicja trzech zmiennych, imię, wiek oraz płec, a następnie 3 funkcje, które obiekt takiej klasy, powinien mieć.
Pamiętajmy, że na razie tworzymy definicję, czyli nowy typ zmiennej. Póki co nie ma jeszcze, stworzonym przez nas obiektów. Te, będziemy tworzyć za chwilę.
To co, jest faktycznie inne, względem tego co wiemy do tej pory na temat funkcji, to słowo ’self’. Jest on przekazywane, jako parametr, do każdej z naszych 3 funkcji, a następnie używane, aby odwołać się do zmiennych, zdefiniowanych w klasie.
Tworzenie obiektu:
Przyszedł czas na utworzenie obiektu, na podstawie naszej klasy. Możemy to zrobić, następująco
c1 = człowiek()
a następnie odwołać się do jego zmiennych, po przez ’.’
mike.imie = „Mike”
mike.ruszaj()
tak jak poniżej:
I tak jak widzimy, wykorzystaliśmy wcześniej utworzoną klasę człowiek, do utworzenia nowego obiektu o nazwie mike. Do jego parametrów oraz funkcji, odwołaliśmy się za pomocą ’.’.
Utworzenie pozostałych dwóch, obiektów, pozostawimy jako zadanie samodzielne.
To na co mogli byśmy od razu narzekać, to, przywisywanie imienia, wieku oraz plci. Przecież jak tworzymy listę, to możemy jej wartości przypisać, już w momencie jej utworzenia. Jak np. lista = [1,3,7]. Dlaczego nie mogli byśmy tego zrobić w naszym przypadku?
Konstruktor:
Konstruktor, jest to funkcja / metoda, klasy, która jest wywoływana automatycznie w momencie jej utworzenia. Co więcej, konstruktor, również może przyjmować parametry, i te parametry, to jest to, co znajduje się w momencie utworzenia obiektu.
Czyli w „mike = człowiek(„Mike”,45,”mężczyzna”)’, to właśnie „Mike”,45,”mężczyzna”, są parametrami przekazywanymi do konstruktora.
Napiszmy jeszcze raz nasza klasę, tym razem z konstruktorem:
class czlowiek: imie = "" wiek = None plec = "" # **** a to jest nasz konstruktor **** def __init__(self, p1,p2,p3): self.imie = p1 self.wiek = p2 self.plec = p3 def przywitaj(self): print ("Cześć. Mam na imię", self.imie) def ruszaj(self): if self.plec == "kobieta": print ("Ruszyłam w drogę") else: print ("Ryszyłem w drogę") def mysl(self): if self.wiek < 2: print ("Dopiero się ucze") else: print ("Nie ma problemu")
Konstruktor, języku Python, zawsze nazywa się '__init__’. Jako parametry, przyjmuje 'self’, a następnie parametry przekazywanie w momencie tworzenia obiektu.
Z reguły, przyjęło się, nazywać przekazywane parametry, nie p1, p2, p3, lecz tak jak zmienne, które modyfikuje:
def __init__(self, imie,wiek,plec): self.imie = imie self.wiek = wiek self.plec = plec
efekt będzie ten sam.Teraz utwórzmy obiekt 'mike’, korzystając z konstruktora:
Podsumowanie. Na chwilę obecną, zapoznaliśmy się tym co to jest programowanie obiektowe, klasa oraz czym się różni od obiektu, a także jak napisać klasę z konstruktorem. Zanim przejdziemy do kolejnych lekcji na temat programowania obiektowego, wykonajmy kilka ćwiczeń, aby utrwalić nowo nabytą wiedzę.
W następnych lekcjach, dowiemy się miedzy innymi na czym polega dziedziczenie, jakie są metody specjalne w klasach, oprócz konstruktora, ale również, złączymy wszystko w całość i napiszemy nasz pierwszy program, zawierający to, czego się do tej pory nauczyliśmy. Zapraszamy!
Ćwiczenia
Ćwiczenie 1: Należy utworzyć klasę książka. Klasa, powinna:
- Przechować informacje na temat: tytułu, ilości stron, autora, data wydania, właściciel
- Posiadać 2 metody / funkcje – 1 – zwraca informacje na temat książki, 2 – zmianę właściciela książki
Ćwiczenie 2: korzystając z wyżej zdefiniowanej klasy, utworzyć kilka obiektów klasy książka, po czym dodać je do listy książek. Lista książek, to zwykła zmienna typu 'lista’.
Ćwiczenie 3: Możemy uprościć zapis definicji naszej klasy. Otóż, nie jest konieczne definiowanie zmiennych autor, tytuł itd,. Konstruktor, odwołując się do self.autor, nawet jeżeli zmienna nie była wcześniej zdefiniowana, utworzy ją. Tak więc uprośćmy naszą definicje.
Rozwiązanie1:
class książka: tytul = "" autor = "" dataWydania = None iloscStron = None wlasciciel = "" def __init__(self, tytul, autor, dataWydania, iloscStron, wlasciciel): self.tytul = tytul self.autor = autor self.dataWydania = dataWydania self.iloscStron = iloscStron self.wlasciciel = wlasciciel def nowyWlasciciel(self, nowyWlasciciel): self.wlasciciel = wlasciciel
Rozwiązanie 2:
k1 = książka("Ojciec Chrzestny", "Puzo Mario", 1969, 500, "Analityk") k2 = książka("Tańczący z wilkami", "Blake Michael", 1988, 500, "Analityk") k3 = książka("Forrest Gump", "Winston Groom", 1986, 500, "Analityk") # można tak listaKsiazek = [k1, k2] # można też tak listaKsiazek.append(k3) # lub można tak listaKsiazek.append(książka("Władca Pierścieni", "J.R.R. Tolkien", 1954, 500, "Analityk")) for i in listaKsiazek: print (i.tytul)
Rozwiązanie3:
class książka:
def __init__(self, tytul, autor, dataWydania, iloscStron, wlasciciel): self.tytul = tytul self.autor = autor self.dataWydania = dataWydania self.iloscStron = iloscStron self.wlasciciel = wlasciciel def nowyWlasciciel(self, nowyWlasciciel): self.wlasciciel = wlasciciel
Python, NIE tylko dla początkujących
- Wstęp do kursu
- Moduły i pakiety
- Programowanie obiektowe – wstęp <– bieżąca lekcja
- Programowanie obiektowe – dziedziczenie
- Programowanie obiektowe – hermetyzacja
- Mini projekt – Organizer
- Funkcje rekurencyjne w Python
- Pisanie skryptów w Python
- Mini projekt – tajny agent, generator haseł
- *args oraz **kwargs
- Dekoratory w Python
- Mini projekt – tajny agent – kontakty
- Odwzorowanie list
- Podsumowanie oraz dalsze kroki