testovac.sk

Statické metódy

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))