__init__()

Metoda wywoływana automatycznie przy tworzeniu obiektu. Zapisuje w nim dane początkowe, czyli atrybuty.

Zwraca
Zawsze None. Gotowy obiekt zwraca samo wywołanie klasy.
Na tej stronie

Przykład

#
Python
class Student:
    def __init__(self, name, points=0):
        self.name = name
        self.points = points
        self.level = points // 100 + 1

ania = Student("Ania", 250)
kuba = Student("Kuba")

print(ania.name, ania.points, ania.level)
print(kuba.name, kuba.points, kuba.level)
print(vars(ania))
Wynikzapisany wynik, możesz go sprawdzić
Ania 250 3
Kuba 0 1
{'name': 'Ania', 'points': 250, 'level': 3}

Definicja i zastosowanie

#

Metoda __init__, potocznie nazywana konstruktorem, przygotowuje nowy obiekt do pracy. Python wywołuje ją sam, zaraz po utworzeniu obiektu, gdy piszesz np. Student("Ania", 250). Argumenty podane w nawiasach przy nazwie klasy trafiają właśnie do __init__, a jej zadaniem jest zapisanie ich w atrybutach obiektu: self.name = name.

Pierwszy parametr, self, to świeżo utworzony obiekt, który Python przekazuje automatycznie. Pozostałe parametry działają jak w zwykłej funkcji: mogą mieć wartości domyślne i można je podawać po nazwie. Atrybuty nie muszą być kopią argumentów, mogą też być z nich wyliczone, np. poziom na podstawie punktów.

Ściśle mówiąc, obiekt powstaje chwilę wcześniej, w metodzie __new__, której zwykle nie trzeba ruszać. __init__ tylko go inicjalizuje i musi zwracać None, a próba zwrócenia innej wartości kończy się błędem TypeError. To dobre miejsce na sprawdzenie poprawności danych: wyjątek zgłoszony w __init__ sprawia, że wywołanie klasy nie zwróci obiektu, więc błędne dane nie trafią dalej do programu.

Składnia

#
Składnia
class Nazwa:
    def __init__(self, parametr, opcjonalny=wartosc):
        self.atrybut = parametr

Parametry

#
  • self

    nowy obiekt

    Tworzony obiekt. Python przekazuje go sam, więc przy wywołaniu go nie podajesz.
  • parametry

    dowolne

    Argumenty podane przy tworzeniu obiektu, np. Student("Ania", 250). Mogą mieć wartości domyślne.

Więcej przykładów

#
Sprawdzanie danych przy tworzeniu obiektu
Python
class Course:
    def __init__(self, title, modules):
        if modules <= 0:
            raise ValueError("Kurs musi mieć co najmniej jeden moduł")
        self.title = title
        self.modules = modules

python = Course("Python", 12)
print(python.title, python.modules)

try:
    Course("Pusty kurs", 0)
except ValueError as error:
    print("Błąd:", error)
Wynikzapisany wynik, możesz go sprawdzić
Python 12
Błąd: Kurs musi mieć co najmniej jeden moduł
Pułapka: lista jako wartość domyślna
Python
class Team:
    def __init__(self, name, members=[]):
        self.name = name
        self.members = members

red = Team("Czerwoni")
blue = Team("Niebiescy")
red.members.append("Ania")
print(blue.members)

class SafeTeam:
    def __init__(self, name, members=None):
        self.name = name
        self.members = list(members) if members is not None else []

red = SafeTeam("Czerwoni")
blue = SafeTeam("Niebiescy")
red.members.append("Ania")
print(blue.members)
Wynikzapisany wynik, możesz go sprawdzić
['Ania']
[]

Domyślna lista powstaje tylko raz, przy definiowaniu metody, więc wszystkie obiekty Team dzielą tę samą listę. SafeTeam tworzy nową listę dla każdego obiektu.

Dobre praktyki

#
  • Ustawiaj wszystkie atrybuty obiektu w __init__, nawet jeśli na początku mają wartość None. Od razu widać wtedy, jakie dane przechowuje obiekt.
  • Nie używaj list ani słowników jako wartości domyślnych parametrów. Wpisz None i twórz nową kolekcję wewnątrz metody.
  • Gdy klasa służy głównie do przechowywania danych, @dataclass wygeneruje __init__ za Ciebie.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.