4.1 Inicjalizacja
Zwykle tuż po utworzeniu obiekty nie są jeszcze gotowe do działania. Najpierw musisz przekazać do nich wszystkie niezbędne dane: parametry działania, wartości początkowe, odnośniki do innych obiektów itp.
Taki proces nazywa się inicjalizacją i powinien odbywać się tuż po utworzeniu obiektu.
Załóżmy, że masz klasę Kot (Cat)
i chcesz nadać mu imię i wiek, co można zrobić na kilka sposobów:
Inicjalizacja atrybutów po utworzeniu obiektu
W tym przykładzie najpierw tworzony jest:
- pusty obiekt
Cat
. - egzemplarz klasy
Cat
o nazwiebarsik
. - a następnie dla obiektu barsik ustawiane są dwa atrybuty:
name
iage
dodawane bezpośrednio do obiektu.
class Cat:
pass
# Utworzenie obiektu Cat
barsik = Cat()
# Inicjalizacja atrybutów po utworzeniu obiektu
barsik.name = "Barsik"
barsik.age = 5
print(f"Imię kota: {barsik.name}, wiek: {barsik.age}") # Wyjście: Imię kota: Barsik, wiek: 5
Użycie metody do inicjalizacji atrybutów
W tym przykładzie do inicjalizacji atrybutów używana jest metoda initialize
. Obiekt Cat
tworzony jest bez żadnego atrybutu, a następnie metoda initialize()
używana jest do ustawienia wartości atrybutów.
class Cat:
def initialize(self, name, age):
self.name = name
self.age = age
# Utworzenie obiektu Cat
barsik = Cat()
# Inicjalizacja atrybutów przez metodę
barsik.initialize("Barsik", 5)
print(f"Imię kota: {barsik.name}, wiek: {barsik.age}") # Wyjście: Imię kota: Barsik, wiek: 5
Użycie pól klasy
W tym przykładzie atrybuty name
i age
są zdefiniowane na poziomie klasy. Po utworzeniu obiektu barsik
atrybuty są inicjalizowane bezpośrednio.
class Cat:
name = ""
age = 0
# Utworzenie obiektu Cat
barsik = Cat()
# Inicjalizacja atrybutów obiektu
barsik.name = "Barsik"
barsik.age = 5
print(f"Imię kota: {barsik.name}, wiek: {barsik.age}") # Wyjście: Imię kota: Barsik, wiek: 5
Jaki sposób jest najlepszy? Żaden! Najlepiej używać konstruktora :)
4.2 Konstruktor
Konstruktor to specjalna metoda, która automatycznie
wywoływana jest przy tworzeniu nowego obiektu klasy. Konstruktor stosowany jest do inicjalizacji pól obiektu i może wykonywać wszelkie początkowe działania potrzebne do skonfigurowania obiektu.
W Pythonie konstruktorem jest metoda o nazwie __init__
. Oto podstawowe fakty na jego temat:
- Metoda
__init__
— to konstruktor w Pythonie. Jest wywoływana automatycznie, gdy tworzony jest nowy egzemplarz klasy. -
__init__
przyjmuje co najmniej jeden parametr —self
, który odnosi się do tworzonego obiektu. Dodatkowo mogą być przekazywane inne parametry do inicjalizacji atrybutów obiektu. - Wewnątrz metody
__init__
można ustawiać początkowe wartości atrybutów obiektu, korzystając zself
. - Konstruktor może wykonywać wszelkie działania potrzebne do skonfigurowania obiektu, na przykład weryfikację danych wejściowych lub ustanowienie połączeń z innymi obiektami.
Parametry przekazywane są konstruktorowi automatycznie, wystarczy, że wskażesz je wewnątrz nawiasów okrągłych podczas tworzenia obiektu.
Oto jak wygląda inicjalizacja naszego kota z użyciem konstruktora:
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
# Utworzenie obiektu Cat z imieniem i wiekiem
barsik = Cat("Barsik", 5)
print(f"Imię kota: {barsik.name}, wiek: {barsik.age}") # Wyjście: Imię kota: Barsik, wiek: 5
Po utworzeniu obiektu typu Cat
automatycznie wywołana zostanie metoda __init__
, i zostaną do niej przekazane trzy parametry:
- Odnośnik do obiektu barsik w parametrze
self
- Łańcuch znaków „Barsik” w parametrze
name
- Liczba 5 w parametrze
age
To jest wygodne i eleganckie.
Walidacja danych
W konstruktorze można także wykonywać walidację danych. W końcu celem konstruktora jest stworzenie poprawnego (prawidłowego) obiektu, z którym można dalej pracować. Przykład:
class Cat:
def __init__(self, name, age):
if age < 0: raise ValueError("Wiek nie może być ujemny")
self.name = name
self.age = age
# Utworzenie obiektu Cat z weryfikacją wieku
try:
barsik = Cat("Barsik", -3)
except ValueError as e:
print(e) # Wyjście: Wiek nie może być ujemny
GO TO FULL VERSION