Wyjaśnienie lekcji
__init__Po tej lekcji będziesz potrafić:
__init__ i inicjalizować atrybuty instancji podczas tworzenia obiektu.self.W poprzedniej lekcji tworzono klasę i dołączano atrybuty po skonstruowaniu każdego obiektu. To działa, ale łatwo zapomnieć o atrybucie. __init__ w Pythonie inicjalizuje instancję automatycznie, gdy wywołasz jej klasę:
class Task:
def __init__(self, name, owner):
self.name = name
self.owner = ownerTask("build", "Maya") konstruuje obiekt i wywołuje __init__ z podanymi argumentami. Python automatycznie dostarcza self; nie przekazujesz go samodzielnie. W odróżnieniu od konstruktora w Javie/C#, __init__ jest metodą inicjalizującą i zwykle nie zwraca wartości.
Parametry konstruktora to tymczasowe dane wejściowe. self.name i self.owner to atrybuty instancji, które pozostają dostępne przez obiekt. Każde wywołanie konstruuje oddzielną instancję z własnym zapisanym stanem.
Wartości domyślne z Jednostki 1 działają także w __init__: def __init__(self, name, retries=0): pozwala wywołującym pominąć liczbę ponowień. Parametry wymagane umieszczaj przed opcjonalnymi.
class Endpoint:
def __init__(self, name, region):
self.name = name
self.region = region
endpoint = Endpoint("billing", "eu")
print(f"{endpoint.name}@{endpoint.region}")Wynik:
billing@euDane wejściowe konstruktora stają się trwałymi atrybutami instancji.
class Deployment:
def __init__(self, tag, ready):
self.tag = tag
self.ready = ready
first = Deployment("v1.4", True)
second = Deployment("v1.5", False)
print(first.ready)
print(second.ready)Wynik:
True
FalseDrugi obiekt nie nadpisuje stanu pierwszego.
class Queue:
def __init__(self, name, pending=0):
self.name = name
self.pending = pending
normal = Queue("email")
busy = Queue("reports", 4)
print(f"{normal.name}: {normal.pending}")
print(f"{busy.name}: {busy.pending}")Wynik:
email: 0
reports: 4Wartość domyślna obowiązuje tylko wtedy, gdy wywołujący pominie argument.
class Wallet:
def __init__(self, owner, balance):
self.owner = owner
self.balance = balance
def deposit(self, amount):
if amount > 0:
self.balance += amount
wallet = Wallet("Ari", 20)
wallet.deposit(7)
print(f"Balance: {wallet.balance}")Wynik:
Balance: 27Metody zmieniają zainicjalizowany stan przez self, a nie przez tymczasową zmienną lokalną.
| Cel | Składnia |
|---|---|
| Inicjalizacja instancji | def __init__(self, name): |
| Zachowanie danych wejściowych konstruktora | self.name = name |
| Utworzenie zainicjalizowanego obiektu | obj = ClassName(value) |
| Podanie opcjonalnej wartości początkowej | def __init__(self, name, count=0): |
| Aktualizacja stanu obiektu | self.count += amount |
name = name zamiast self.name = name nie zapisuje atrybutu w instancji.self, zgłasza AttributeError.__init__ zgłasza TypeError; do zwracania wyników używaj innych metod.