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
Cato nazwiebarsik. - a następnie dla obiektu barsik ustawiane są dwa atrybuty:
nameiagedodawane 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