CodeGym /Kursy /Python SELF PL /Tworzenie klas i obiektów

Tworzenie klas i obiektów

Python SELF PL
Poziom 15 , Lekcja 3
Dostępny

3.1 Tworzenie klasy

Tworzenie klas w Pythonie to ważna część programowania obiektowego (OOP). Klasy pozwalają tworzyć nowe typy danych, które mogą mieć własne atrybuty i metody. Zobaczmy podstawowe pojęcia i przykłady tworzenia klas w Pythonie.

Podstawowe pojęcia

  • Klasa: szablon do tworzenia obiektów. Klasa określa atrybuty i metody, które będą miały obiekty tej klasy.
  • Obiekt: instancja klasy. Obiekt posiada wszystkie atrybuty i metody zdefiniowane w klasie.
  • Atrybut: zmienna związana z klasą lub obiektem.
  • Metoda: funkcja związana z klasą lub obiektem.

Atrybuty to w zasadzie wewnętrzne zmienne obiektu lub klasy. Metody to funkcje zdefiniowane wewnątrz klasy. Te terminy pochodzą z OOP i są używane na równi z funkcjami i zmiennymi.

Do deklarowania (tworzenia) nowej klasy używamy słowa kluczowego class. Ogólna składnia tej operacji wygląda tak:


class NazwaKlasy:
    zmienna1 = wartość1
    zmiennaN = wartośćN
          
    def funkcja1(self):
        kod funkcji
            
    def funkcjaM(self):
        kod funkcji

W zasadzie można powiedzieć, że klasa to mały program (zmienne + funkcje), umieszczony w oddzielnym, nazwanym obszarze — NazwaKlasy.

Po utworzeniu klasy, możemy tworzyć obiekty (instancje) tej klasy. Ten kod wygląda jeszcze prościej:


zmiennaX = NazwaKlasy()

Ważne! Nazwy zmiennych i metod w Pythonie piszemy od małej litery. Nazwy klas — od wielkiej. Również przy pisaniu nazw klas nie używamy podkreśleń. Jeśli nazwa klasy ma składać się z kilku słów, to każde z nich piszemy wielką literą.

Jeśli chcesz odwołać się do zmiennej klasy/obiektu, to zazwyczaj kod wygląda tak:


zmiennaX.zmienna1 = 10
zmiennaX.funkcjaM()       

Ale są tu pewne niuanse, o których poniżej…

3.2 Praca z obiektem

I klasa, i instancja klasy (obiekt klasy) są obiektami, więc zarówno pierwszy, jak i drugi mogą mieć swoje zmienne i metody.

Istnieją dwa typy zmiennych:

  • Atrybut/Zmienna/Pole klasy (class property)
  • Atrybut/Zmienna/Pole obiektu (object property)

A także trzy typy metod:

  • Metoda/Funkcja klasy (class method)
  • Metoda/Funkcja obiektu (instance method)
  • Metoda statyczna (static method)

Metody różnią się sposobem swojego deklarowania i tym, jak są wywoływane.

Metody obiektu

Przy deklarowaniu metody obiektu trzeba przekazać do niej pierwszy obowiązkowy parametr — self. Przy wywołaniu metody do tego parametru przekazywana jest referencja do obiektu (instance).


class MyClass:

    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
                   

my_object = MyClass()
my_object.instance_method()

W powyższym przykładzie, kiedy zaczęła wykonywać się funkcja instance_method(), do parametru self została przekazana referencja do obiektu my_object.

Metody klasy

Przy deklarowaniu metody klasy należy również przekazać do niej pierwszy obowiązkowy parametr — cls. Przy wywołaniu metody do tego parametru przekazywana jest referencja do klasy (class object). Także metoda klasy musi być oznaczona dekoratorem classmethod, jak w poniższym przykładzie:


class MyClass:
    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
        
    @classmethod
    def class_method(cls):
        print(type(cls))  # <class 'type'>
                   

my_object = MyClass()
my_object.instance_method()
MyClass.class_method()

W powyższym przykładzie, kiedy zaczęła wykonywać się funkcja class_method(), do parametru cls została przekazana referencja do klasy MyClass.

Metoda statyczna

Przy deklarowaniu metody statycznej nie trzeba przekazywać żadnych parametrów, ale nie będzie ona mogła odwoływać się do wewnętrznych danych klasy. Również metoda musi być oznaczona dekoratorem staticmethod, jak w poniższym przykładzie:


class MyClass:
    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
        
    @classmethod
    def class_method(cls):
        print(type(cls))  # <class 'type'>
        
    @staticmethod
    def static_method():
        return "Ta metoda nie zależy od instancji lub klasy"
                   
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method() 

Metoda statyczna jest wywoływana bardzo podobnie do metody klasy, ale ani referencja do obiektu, ani referencja do klasy nie są do niej przekazywane.

3.3 Zmienne klasy

Zmienne klasy

Aby zadeklarować zmienną (atrybut) klasy, wystarczy ją ogłosić w dowolnym miejscu wewnątrz klasy. Zwykle robi się to na samym początku, przed deklaracją metod klasy. Przykład:


class MyClass:
    attribute = "Jestem atrybutem klasy"
        
    @classmethod
    def class_method(cls):
        print(cls.attribute)  # Jestem atrybutem klasy
                  
my_object = MyClass()
MyClass.class_method()

Jeśli chcesz odczytać lub zapisać wartość w zmiennej klasy, używaj obiektu cls.

W zasadzie można się odwołać do zmiennej klasy również przez nazwę klasy:


class MyClass:
    attribute = "Jestem atrybutem klasy"
        
    @classmethod
    def class_method(cls):
        print(MyClass.attribute)  # Jestem atrybutem klasy
                  
my_object = MyClass()

print(MyClass.attribute)  # Jestem atrybutem klasy

Zmienne/pola obiektu

Zmienne obiektu (instance) — to pola obiektu self. Pracujesz z nimi przez self.name. Właśnie dlatego obiekt self jest przekazywany do każdej metody obiektu.

Przykład:


class MyClass:
    attribute = "Jestem atrybutem klasy"
        
    def set_name(self, name):
        self.name = name
        
    def print_name(self):
        print(self.name)    
                 
my_object = MyClass()
my_object.set_name("Pole obiektu o nazwie name") 
my_object.print_name()  # "Pole obiektu o nazwie name"

Za każdym razem, gdy wywołujesz metodę obiektu, jako pierwszy parametr (self) przekazywana jest referencja do obiektu, dla którego wywołujesz metodę. Różne metody obiektu mogą odwoływać się do wspólnych danych poprzez użycie obiektu self.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION