https://docs.python.org/3/library/functions.html
Metody statyczne są opcją dodaną w Pythonie 2.2. Pozwalają one zapisywać w kodzie klasy funkcje nieoczekujące podania obiektów instancji w pierwszym argumencie. Takie metody mogą działać jak proste funkcje bez instancji, ich nazwy są lokalne dla klas, w których są zapisane. Metody statyczne mogą być wykorzystane do zarządzania danymi klas.
Do tych zadań można byłoby wykorzystać zwykłe funkcje zdefiniowane poza klasą, które mają dostęp do atrybutów klasy za pośrednictwem nazwy klasy. Jednak dzięki powiązaniu z klasą można lepiej podzielić kod programu oraz można korzystać z dziedziczenia.
Metody klasy jako pierwszy argument mają obiekt klasy (cls), a nie obiekt instancji (self). Metodę klasy można użyć do budowy dodatkowego konstruktora.
class Methods:
def imeth(self, x): # zwykła metoda instancji
# Pierwszy argument to zwyczajowo self (bieżąca instancja).
print("{} {}".format(self, x))
def smeth(x): # metoda statyczna
# Pierwszy argument to nie jest self.
print(x)
def cmeth(cls, x): # metoda klasy
# Pierwszy argument tradycyjnie nazywamy cls, a nie self.
# cls to obiekt klasy (tutaj to klasa Methods).
print("{} {}".format(cls, x))
smeth = staticmethod(smeth) # przekształcanie
cmeth = classmethod(cmeth) # przekształcanie
# Zastosowanie.
item = Methods()
item.imeth(1) # <__main__.Methods instance at 0xb739546c> 1
Methods.imeth(item, 2) # <__main__.Methods instance at 0xb739546c> 2
# Przy metodach statycznych i metodach klas nie musi istnieć instancja klasy.
Methods.smeth(3) # 3
item.smeth(4) # 4
Methods.cmeth(5) # __main__.Methods 5
item.cmeth(6) # __main__.Methods 6
Do utworzenia metod statycznych i metod klasy można użyć dekoratorów metod.
class Methods:
@staticmethod # składnia dekoratora
def smeth(x): pass
@classmethod # składnia dekoratora
def cmeth(cls, x): pass
class Frac:
@staticmethod
def gcd(m, n): # algorytm Euklidesa
if m % n == 0:
return n
else:
return Frac.gcd(n, m % n)
assert Frac.gcd(6, 4) == 2
class Poly:
def __init__(self, coefficient=0, n=0):
# Na bazie Sedgewicka - tworzymy wielomian c*(x**n).
self.size = n + 1 # rozmiar tablicy
self.data = self.size * [0]
self.data[self.size - 1] = coefficient
@classmethod
def from_iterable(cls, iterable): # dodatkowy konstruktor
new_poly = cls() # działa zwykły konstruktor
new_poly.data = list(iterable)
new_poly.size = len(new_poly.data)
return new_poly
assert Poly.from_iterable([0, 3, 5]) == Poly(3, 1) + Poly(5, 2)