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:

Definiowanie obiektów i klas w Python. Programowanie obiektowe

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

  1. Wstęp do kursu
  2. Moduły i pakiety
  3. Programowanie obiektowe – wstęp <– bieżąca lekcja
  4. Programowanie obiektowe – dziedziczenie
  5. Programowanie obiektowe – hermetyzacja
  6. Mini projekt – Organizer
  7. Funkcje rekurencyjne w Python
  8. Pisanie skryptów w Python
  9. Mini projekt – tajny agent, generator haseł
  10. *args oraz **kwargs
  11. Dekoratory w Python
  12. Mini projekt – tajny agent – kontakty
  13. Odwzorowanie list
  14. Podsumowanie oraz dalsze kroki