Wyjaśnienie lekcji
Po tej lekcji będziesz potrafić:
self), klasy (cls) albo żadnego z nich.@classmethod, aby pracować z informacjami na poziomie klasy lub tworzyć obiekty.@staticmethod dla funkcji pomocniczej, która koncepcyjnie należy do klasy.Zwykła metoda instancji zaczyna się od self, czyli bieżącego obiektu. Była już używana do odczytu i zmiany atrybutów utworzonych w __init__:
class Job:
def __init__(self, name):
self.name = name
def display_name(self):
return self.name.upper()Metoda klasowa zaczyna się od cls i jest oznaczona @classmethod. Automatycznie otrzymuje klasę, niezależnie od tego, czy wywołasz ją przez klasę, czy przez instancję. Metody klasowe są przydatne do odczytu wspólnego ustawienia lub konstruowania instancji z innego formatu danych wejściowych.
Metoda statyczna, oznaczona @staticmethod, nie otrzymuje automatycznie ani self, ani cls. Użyj jej dla ściśle powiązanego obliczenia lub walidacji, które nie potrzebuje stanu obiektu.
Te adnotacje używają składni @..., ale ogólnych dekoratorów jeszcze nie potrzebujesz. @classmethod i @staticmethod to wbudowane formy, których potrzebujesz w tej lekcji.
cls odnosi się do klasy, więc wynik używa jej wspólnego ustawienia.
class Mailer:
default_sender = "robot@example.com"
@classmethod
def sender(cls):
return cls.default_sender
print(Mailer.sender())Wynik:
robot@example.comW odróżnieniu od metody instancji, można ją wywołać bez tworzenia obiektu Mailer.
Metoda statyczna grupuje funkcję pomocniczą z typem, do którego się odnosi. Przyjmuje tylko parametry, które napiszesz.
class PortRules:
@staticmethod
def is_allowed(port):
return 1 <= port <= 65535
print(PortRules.is_allowed(443))Wynik:
TrueNie ma ani self, ani cls w is_allowed, ponieważ metoda używa tylko port.
Metoda klasowa może oferować inny sposób utworzenia poprawnej instancji.
class Badge:
def __init__(self, title):
self.title = title
@classmethod
def from_text(cls, raw_title):
return cls(raw_title.strip())
print(Badge.from_text(" Operator ").title)Wynik:
OperatorUżycie cls(...) konstruuje instancję klasy, która otrzymała wywołanie.
Metoda używająca self zwraca informacje o konkretnym obiekcie.
class Subscription:
def __init__(self, plan, active):
self.plan = plan
self.active = active
def status(self):
if self.active:
return f"{self.plan}: active"
return f"{self.plan}: inactive"
print(Subscription("starter", False).status())Wynik:
starter: inactiveKażda subskrypcja może mieć inny stan, więc metoda instancji jest odpowiednia.
| Metoda | Pierwszy parametr | Otrzymywane automatycznie | Typowe zastosowanie |
|---|---|---|---|
| Metoda instancji | self | Obiekt | Odczyt/aktualizacja jego atrybutów |
@classmethod | cls | Klasa | Wspólne ustawienia, alternatywne konstruktory |
@staticmethod | Żaden z nich | Nic | Powiązana walidacja, normalizacja |
@classmethod i założenie, że cls jest przekazywane automatycznie.self, mimo że wywołujący podaje tylko jej jawne argumenty.self.setting, gdy celem jest zmiana ustawienia współdzielonego przez klasę.