Stane sa, že na manipuláciu s objektami nejakej Triedy potrebujeme definovať funkciu ktorá nie je priamo viazaná na konkrétnu inštanciu ale spracúva objekty nejakej Triedy, teda s ňou úzko súvisí. Takúto funkciu môžeme definovať v globálnom kontexte (úplne mimo tried) alebo lepšie - zaradíme ju do triedy s ktorou súvisí. Keďže táto metóda nie je viazaná na konkrétnu inštanciu, nepotrebuje parameter self, tú ale majú všetky metódy v triede... až na prípady, kedy ich označíme špeciálnym dekorátorom @staticmethod.
Pozri kód...
Zisťovanie, či je nejaký vek už "dospelák" nemusí prislúchať konkrétnej osobe...
class Person():
def __init__(self, meno):
self.__meno = meno
@staticmethod
def isAdult(age):
return age >= 18
# statické metódy môžem volať bez vytvorenia inštancie
print(Person.isAdult(17))
Častým použitím statických metód sú funkcie spracúvajúce viacero inštancii triedy naraz - napríklad spracujú celý zoznam inštancií danej triedy.
class Vozidlo():
# cena paliva je atribút triedy - pre všetky vozidlá rovnaká
cena_liter_paliva = 1.53
def __init__(self, meno, spotreba):
self.meno = meno
self.spotreba = spotreba
@staticmethod
def nakladyFlotily(vozidla, kilometre):
celkova_spotreba = 0
for vozidlo in vozidla:
spotreba = Vozidlo.cena_liter_paliva * vozidlo.spotreba * kilometre/100
celkova_spotreba += spotreba
return(celkova_spotreba)
# vytvárame 2 konkrétne vozidlá, s rôznym názvom a spotrebou
a1 = Vozidlo("Skoda 110", 10)
a2 = Vozidlo("Skoda 120", 20)
# flotila = zoznam vozidiel
flotila = [a1, a2]
# počítame koľko bude stáť presun flotily (2 áut naraz) o 100km
print(Vozidlo.nakladyFlotily(flotila, 100))