Wyjaśnienie lekcji
Po tej lekcji będziesz potrafić:
self.Jeśli znasz klasy z Javy lub C#, podstawowa idea Pythona będzie znajoma: klasa definiuje typ obiektu, a instancja to jeden konkretny obiekt tej klasy. Python używa dwukropka i wcięć zamiast nawiasów klamrowych:
class Server:
passNa razie pass nadaje klasie poprawne, puste ciało. Obiekt tworzysz, wywołując nazwę klasy: server = Server(). Pola, zwane atrybutami, możesz dołączać bezpośrednio do tej instancji za pomocą notacji z kropką: server.region = "eu". Dwie instancje mogą przechowywać różne wartości bez wzajemnego wpływu.
Metoda to funkcja zapisana wewnątrz klasy. Metoda instancji deklaruje self jako pierwszy parametr. Gdy wywołasz server.label(), Python automatycznie przekazuje server jako self. Wewnątrz metody self.region oznacza region konkretnego obiektu, który otrzymał wywołanie. Metody mogą też aktualizować atrybuty instancji.
W tej pierwszej lekcji przypisujemy atrybuty po utworzeniu każdego obiektu, abyś mógł wyraźnie zobaczyć model obiektowy. W następnej lekcji __init__ pokaże, jak inicjalizować atrybuty podczas tworzenia obiektu. Atrybuty klasy i dziedziczenie omówimy później.
Pusta klasa wystarcza, aby tworzyć instancje i dołączać do każdej inne wartości.
class Endpoint:
pass
public = Endpoint()
public.path = "/public"
internal = Endpoint()
internal.path = "/internal"
print(public.path)
print(internal.path)Wynik:
/public
/internalDwa atrybuty path należą do różnych obiektów.
Ta sama metoda może zwrócić inny wynik dla każdej instancji, ponieważ self odnosi się do obiektu, który ją wywołał.
class Printer:
def label(self):
return f"{self.name} ({self.region})"
first = Printer()
first.name = "labels"
first.region = "eu"
print(first.label())Wynik:
labels (eu)Metoda używa atrybutów dołączonych do first.
Metoda może zmienić atrybut przez self. Ta zmiana pozostaje przy tym obiekcie.
class Counter:
def record(self):
self.total += 1
counter = Counter()
counter.total = 0
counter.record()
counter.record()
print(f"Total: {counter.total}")Wynik:
Total: 2Atrybut total został utworzony, zanim record() go użyło. Następna lekcja uczyni to ustawienie bardziej niezawodnym.
| Cel | Python |
|---|---|
| Zdefiniowanie klasy | class Worker: |
| Zachowanie poprawności pustego ciała | pass |
| Utworzenie instancji | worker = Worker() |
| Przypisanie atrybutu instancji | worker.name = "api" |
| Odczyt atrybutu | worker.name |
| Zdefiniowanie metody instancji | def label(self): |
| Użycie obiektu wywołującego wewnątrz metody | self.name |
self w metodzie: zwykłe metody instancji potrzebują go jako pierwszego parametru.self.name, a nie samo name, aby odczytać atrybut tej instancji.first.status nie zmienia second.status.AttributeError.