Staat­ti­set me­ne­tel­mät voidaan kutsua suoraan luokan nimen kautta ilman, että luokkaa tarvitsee ins­tan­soi­da. Tämä Python staticmethod omi­nai­suus helpottaa luokan logiikan ja ins­tans­si­tie­to­jen selkeää erot­ta­mis­ta toi­sis­taan.

Mihin Python staticmethod käytetään?

Python staticmethod on sekä funktio että koriste. Sitä käytetään mää­rit­tä­mään me­ne­tel­miä, jotka toimivat riip­pu­mat­ta luokkien ins­tans­seis­ta. Koristeet Pyt­ho­nis­sa ovat funk­tioi­ta, jotka muok­kaa­vat muiden me­ne­tel­mien käyt­täy­ty­mis­tä li­sää­mäl­lä li­sä­toi­min­to­ja ennen tai jälkeen niiden suo­rit­ta­mi­sen, muut­ta­mat­ta al­ku­pe­räis­tä funk­tio­koo­dia. Toisin kuin ins­tans­si­me­ne­tel­mät, staat­ti­set funktiot eivät vaadi impli­siit­tis­tä pa­ra­met­ria, kuten self.

Pyt­ho­nis­sa staticmethod käyttö tarjoaa koh­den­ne­tun lä­hes­ty­mis­ta­van luokkien sisällä olevien funk­tioi­den jä­sen­tä­mi­seen, jotka eivät vaadi pääsyä ins­tans­si­tie­toi­hin. Koska ne eivät ole sidottuja ins­tans­siin, ne eivät voi muuttaa objektin tilaa. Luokkien sisällä ne toimivat ar­vok­kai­na työ­ka­lui­na yleisten tehtävien suo­rit­ta­mi­seen tai glo­baa­lien toi­min­to­jen tar­joa­mi­seen. Ne voivat esi­mer­kik­si sisältää apuoh­jel­mia, muun­nos­ru­tii­ne­ja ja yleisiä apu­funk­tioi­ta, joita voidaan kutsua ilman ins­tans­si­tie­to­ja.

Mikä on Python staticmethod:n syntaksi?

Pyt­ho­nis­sa on kaksi tapaa luoda staat­ti­sia metodeja. Voit käyttää staticmethod() -funktiota tai @staticmethod.

staticmethod()

staticmethod() on si­sään­ra­ken­net­tu Python-funktio, joka tekee luokan metodista staat­ti­sen. Pythonin pa­lau­tusar­vo staticmethod() on staat­ti­nen metodi funk­tiol­le, joka vä­li­te­tään ar­gu­ment­ti­na. Syntaksi on:

class Class:
    def staticmethodFunc(x,y):
        return x + y
Class.staticmethodFunc = staticmethod(Class.staticmethodFunc)
print('Sum = ', Class.staticmethodFunc(5,7)) # Output: Sum = 12
python

Syöt­tä­mäl­lä Class mää­ri­tel­lyn staticmethodFunc() ar­gu­ment­ti­na staticmethod()ään, voimme nyt kutsua mu­kau­te­tun me­ne­tel­män suoraan luokan nimen kautta.

@staticmethod

@staticmethod on lyhyempi ja yleisempi tapa merkitä funktio staat­ti­sek­si. De­ko­ra­to­ri si­joi­te­taan luokan mää­ri­tel­mäs­sä metodin ylä­puo­lel­le. Syntaksi on:

class Class:
    @staticmethod
    def staticmethodFunc(x, y):
        return x + y
print('Sum = ', Class.staticmethodFunc(5,7)) # Output: Sum = 12
python

@staticmethod ilmoittaa tulkille, että mää­ri­tel­tyä funktiota tulisi käsitellä staat­ti­se­na me­ne­tel­mä­nä.

Python staticmethod -koo­die­si­mer­kit

Staat­ti­sia me­ne­tel­miä voidaan käyttää mo­nen­lai­siin tehtäviin. Alla on muutamia käytännön esi­merk­ke­jä staat­tis­ten me­ne­tel­mien käytöstä.

Yk­si­köi­den muun­ta­mi­nen

Python staticmethod on erittäin hyö­dyl­li­nen yk­si­köi­den muun­ta­mi­ses­sa.

class Converter:
    @staticmethod
    def hoursToMinutes(hours):
        return hours * 60
    @staticmethod
    def minutesToHours(minutes):
        return minutes / 60
hours = 3
converted_minutes = Converter.hoursToMinutes(hours)
print(f"{hours} hours are {converted_minutes} minutes.") # Output: 3 hours are 180 minutes.
minutes = 180
converted_hours = Converter.minutesToHours(minutes)
print(f"{minutes} minutes are {converted_hours} hours.") # Output: 180 minutes are 3 hours.
python

Tässä esi­mer­kis­sä luokalla Converter on kaksi staat­tis­ta me­ne­tel­mää tuntien ja mi­nuut­tien muun­ta­mi­sek­si. Menetelmä hoursToMinutes() muuntaa tunnit mi­nuu­teik­si, kun taas minutesToHours() muuntaa minuutit tunneiksi.

Voimme kutsua staat­ti­sia metodeja luokan nimen kautta ilman, että meidän tarvitsee luoda luokan ins­tans­sia. Niihin pääsee käsiksi Converter.hoursToMinutes() tai Converter.minutesToHours() kautta, jossa Converter on luokan nimi. Tu­los­tam­me tuloksen f-merk­ki­jo­no­na, joka on Python-merk­ki­jo­no­muo­to, joka linkittää lausek­kei­ta.

Ma­te­maat­tis­ten las­kel­mien apu­toi­min­not

Voit myös käyttää Pythonin sta­tic­met­hod()-funktiota apu­funk­tioi­den mää­rit­te­le­mi­seen tois­si­jai­sia laskelmia varten.

class Calculator:
    @staticmethod
    def square(x):
        return x * x
    @staticmethod
    def sqroot(x):
        return x ** 0.5
num = 9
square = Calculator.square(num)
print(f"The square of {num} is {square}.") # Output: The square of 9 is 81.
root = Calculator.sqroot(num)
print(f"The square root of {num} is {root}.") # Output: The square root of 9 is 3.
python

Koo­die­si­merk­ki esittelee Calculator, jossa on staat­ti­set me­ne­tel­mät luvun neliön ja ne­liö­juu­ren las­ke­mi­sek­si. Käytämme @staticmethod mer­kit­se­mään square() ja sqroot() staat­ti­sik­si me­ne­tel­mik­si. Luomatta luokan ins­tans­sia kutsumme me­ne­tel­miä luokan nimen kautta. Yh­dis­täm­me Calculator.square() ja Calculator.sqroot() tulokset f-merk­ki­jo­nos­sa.

Tietojen vah­vis­ta­mi­nen

Pythonin sta­tic­met­hod-me­ne­tel­män toinen käyt­tö­tar­koi­tus on syöt­tei­den va­li­doin­ti.

class Validator:
    @staticmethod
    def isInteger(num):
        try:
            int(num)
            return True
        except ValueError:
            return False
    @staticmethod
    def isDecimal(num):
        try:
            float(num)
            return True
        except ValueError:
            return False
input = "123"
is_integer = Validator.isInteger(input)
print(f"Is '{input}' an integer? {is_integer}") # Output: Is '123' an integer? True
input = "3.14"
is_dec = Validator.isDecimal(input)
print(f"Is '{input}' a decimal number? {is_dec}") # Output: Is '3.14' a decimal number? True
python

Luokka Validator sisältää kaksi staat­tis­ta me­ne­tel­mää: isInteger() ja isDecimal(). Nämä funktiot tar­kis­ta­vat, onko annettu syöte ko­ko­nais­lu­ku vai de­si­maa­li­lu­ku. Pythonin staat­ti­nen menetelmä isInteger() ottaa syötteen ja yrittää muuntaa sen ko­ko­nais­lu­vuk­si (int(num)). Jos muun­ta­mi­nen onnistuu, pa­lau­te­taan True. Muussa ta­pauk­ses­sa saadaan False, jos poikkeus ValueError havaitaan, mikä tapahtuu, kun va­li­doin­ti ei ole mah­dol­lis­ta.

Käytämme isDecimal() muun­taak­sem­me syötteen de­si­maa­li­lu­vuk­si (float(num)). Jos muunnos onnistuu, pa­lau­te­taan True, muuten False. Sitten käytämme isInteger() ja isDecimal() -luokan staat­ti­sia me­ne­tel­miä Validator tar­kis­taak­sem­me syötteet "123" ja "3.14". Tulokset ovat totta mo­lem­mil­le funk­tioil­le.

Merk­ki­jo­no­jen ma­ni­pu­loin­ti

Alla olevassa esi­mer­kis­sä mää­ri­tel­lään luokka StringManipulation staat­ti­sel­la me­ne­tel­mäl­lä reverseText(). Se ottaa pa­ra­met­rik­si tekstin ja käyttää leik­kaus­syn­taxia [::-1] tekstin kään­tä­mi­seen "Hello World!" ja tuloksen pa­laut­ta­mi­seen.

class StringManipulation:
    @staticmethod
    def reverseText(text):
        return text[::-1]
input_text = "Hello World!"
result = StringManipulation.reverseText(input_text)
print(f"Reversed text of '{input_text}': {result}") # Output: Reversed text of 'Hello World!': !dlroW olleH
python
Siirry pää­va­lik­koon