@staticmethod

Metoda, która nie dostaje automatycznie ani obiektu, ani klasy. Działa jak zwykła funkcja umieszczona w klasie.

Na tej stronie

Przykład

#
Python
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))
Wynikzapisany wynik, możesz go sprawdzić
True False
75
[85, 64]
True

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

#
Składnia
class Nazwa:
    @staticmethod
    def metoda(argumenty):
        ...

Nazwa.metoda(argumenty)

Więcej przykładów

#
Trzy rodzaje metod w jednej klasie
Python
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"))
Wynikzapisany wynik, możesz go sprawdzić
Kurs Python od zera
Kursów: 1
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

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.