__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.
Przykład
#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))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
#class Nazwa:
def __init__(self, parametr, opcjonalny=wartosc):
self.atrybut = parametrParametry
#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
#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)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)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
Nonei twórz nową kolekcję wewnątrz metody. - Gdy klasa służy głównie do przechowywania danych,
@dataclasswygeneruje__init__za Ciebie.
Powiązane hasła
#- classDefiniuje klasę: szablon obiektów łączący dane i funkcje, które na nich działają.
- selfPierwszy parametr metody: obiekt, na którym metodę wywołano. Daje dostęp do jego atrybutów i innych metod.
- super()Wywołuje metodę klasy bazowej z wnętrza klasy pochodnej, najczęściej konstruktor __init__.
- @dataclassDekorator, który na podstawie pól z adnotacjami typów generuje __init__, __repr__ i __eq__ klasy przechowującej dane.
- __str__() i __repr__()Metody określające tekstowy wygląd obiektu: czytelny dla użytkownika (__str__) i techniczny dla programisty (__repr__).
Widzisz błąd albo brakuje przykładu? Napisz do nas.