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
.
GO TO FULL VERSION