@staticmethod
Metoda, która nie dostaje automatycznie ani obiektu, ani klasy. Działa jak zwykła funkcja umieszczona w klasie.
Przykład
#class Grade:
def __init__(self, points):
if not Grade.is_valid(points):
raise ValueError("Punkty muszą być od 0 do 100")
self.points = points
@staticmethod
def is_valid(points):
return 0 <= points <= 100
@staticmethod
def to_percent(points, maximum):
return round(points / maximum * 100)
print(Grade.is_valid(85), Grade.is_valid(120))
print(Grade.to_percent(18, 24))
print(list(filter(Grade.is_valid, [85, 120, -5, 64])))
print(Grade(72).is_valid(50))Definicja i zastosowanie
#Dekorator @staticmethod tworzy metodę statyczną: funkcję, która należy do klasy, ale nie dostaje automatycznie żadnego pierwszego argumentu. Nie ma w niej self ani cls, więc nie ma też dostępu do atrybutów obiektu czy klasy, chyba że przekażesz je jawnie.
Metodę statyczną wywołasz przez klasę (Grade.is_valid(72)) albo przez obiekt, a wynik zależy wyłącznie od argumentów. Stosuje się ją do funkcji pomocniczych, które logicznie należą do klasy, np. walidacji albo przeliczeń, ale nie potrzebują jej danych. Umieszczenie ich w klasie grupuje powiązany kod i ułatwia jego znalezienie.
Jeśli funkcja pomocnicza nie jest związana z żadną klasą, zwykle lepiej zostawić ją jako zwykłą funkcję w module. Gdy metoda ma tworzyć obiekty klasy albo korzystać z atrybutów klasy, potrzebujesz @classmethod.
Składnia
#class Nazwa:
@staticmethod
def metoda(argumenty):
...
Nazwa.metoda(argumenty)Więcej przykładów
#class Course:
count = 0
def __init__(self, title):
self.title = title
Course.count += 1
def describe(self):
return f"Kurs {self.title}"
@classmethod
def total(cls):
return f"Kursów: {cls.count}"
@staticmethod
def slugify(title):
return title.lower().replace(" ", "-")
python = Course("Python od zera")
print(python.describe())
print(Course.total())
print(Course.slugify("Python od zera"))Zwykła metoda dostaje obiekt (self), metoda klasy dostaje klasę (cls), a metoda statyczna tylko to, co przekażesz.
Dobre praktyki
#- Jeśli metoda nie używa
self, zastanów się, czy nie powinna być statyczna albo w ogóle znaleźć się poza klasą. - Metodę statyczną wywołuj raczej przez nazwę klasy. Od razu widać, że nie zależy od stanu obiektu.
- Metody statyczne łatwo testować, bo ich wynik zależy tylko od argumentów.
Powiązane hasła
#- @classmethodMetoda, która zamiast obiektu dostaje klasę (cls). Najczęściej służy jako alternatywny konstruktor.
- selfPierwszy parametr metody: obiekt, na którym metodę wywołano. Daje dostęp do jego atrybutów i innych metod.
- classDefiniuje klasę: szablon obiektów łączący dane i funkcje, które na nich działają.
- DekoratoryFunkcje, które opakowują inne funkcje i dodają im zachowanie, np. logowanie lub sprawdzanie uprawnień. Zapis @nazwa.
- defDefiniuje funkcję: nazwany blok kodu z parametrami, który można wywoływać wielokrotnie.
Widzisz błąd albo brakuje przykładu? Napisz do nas.