Statične metode se lahko pokličejo ne­po­sre­dno prek imena razreda, brez da bi bilo treba razred in­stan­ci­i­ra­ti. Ta zna­čil­nost Python staticmethod omogoča jasno ločitev logike razreda od podatkov instance.

Za kaj se uporablja Python staticmethod?

Python staticmethod je tako funkcija kot dekorator. Uporablja se za ozna­če­va­nje metod, ki delujejo neodvisno od primerov razredov. De­ko­ra­tor­ji v Pythonu so funkcije, ki spre­mi­nja­jo delovanje drugih metod z do­da­ja­njem dodatnih funk­ci­o­nal­no­sti pred ali po njihovem izvajanju, ne da bi spre­mi­nja­li izvirni kod funkcije. Za razliko od metod primerov, statične funkcije ne po­tre­bu­je­jo im­pli­ci­tne­ga parametra, kot je self.

Uporaba staticmethod v Pythonu ponuja osre­do­to­čen pristop k struk­tu­ri­ra­nju funkcij znotraj razredov, ki ne zahtevajo dostopa do podatkov o primerkih. Ker niso vezani na primerke, ne morejo spre­mi­nja­ti stanja objekta. Znotraj razredov služijo kot dragocena orodja za izvajanje pogostih nalog ali ponujanje globalne funk­ci­o­nal­no­sti. Na primer, lahko vsebujejo pomožne programe, rutine za pretvorbo in splošne pomožne funkcije, ki jih je mogoče poklicati brez podatkov o primerkih.

Kakšna je sintaksa Python staticmethod?

V Pythonu obstajata dva načina za ustvar­ja­nje statičnih metod. Uporabite lahko funkcijo staticmethod() ali dekorator @staticmethod.

staticmethod()

staticmethod() je vgrajena funkcija Python, ki naredi metodo razreda statično. Vrnjena vrednost Python staticmethod() je statična metoda za funkcijo, ki je prenesena kot argument. Sintaksa je:

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

S predajo funkcije staticmethodFunc(), de­fi­ni­ra­ne v razredu Class, kot argumenta staticmethod(), lahko zdaj pokličemo pri­la­go­je­no metodo ne­po­sre­dno prek imena razreda.

@staticmethod

Dekorator @staticmethod je krajša in bolj pogosta metoda za ozna­če­va­nje funkcije kot statične. Dekorator se postavi nad metodo v de­fi­ni­ci­ji razreda. Sintaksa je:

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

Dekorator @staticmethod in­ter­pre­ter­ju si­gna­li­zi­ra, da je treba de­fi­ni­ra­no funkcijo obrav­na­va­ti kot statično metodo.

Primeri kode v Python staticmethod

Statične metode lahko upo­ra­blja­te za različne naloge. Spodaj je nekaj prak­tič­nih primerov, kako upo­ra­blja­ti statične metode.

Pre­tvar­ja­nje enot

Python staticmethod je zelo uporaben za pre­tvar­ja­nje enot.

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

V tem primeru ima razred Converter dve statični metodi za pretvorbo med urami in minutami. Metoda hoursToMinutes() pretvarja ure v minute, medtem ko minutesToHours() pretvarja minute v ure.

Statične metode lahko pokličemo prek imena razreda, ne da bi morali ustvariti instanco razreda. Dostopamo do njih prek Converter.hoursToMinutes() ali Converter.minutesToHours(), kjer je Converter ime razreda. Rezultat izpišemo v f-nizu, formatu niza v Pythonu, ki povezuje izraze.

Pomožne funkcije za ma­te­ma­tič­ne izračune

Za opre­de­li­tev pomožnih funkcij za se­kun­dar­ne izračune lahko uporabite tudi Pythonovo sta­ti­cme­thod().

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

Primer kode prikazuje razred Calculator s sta­tič­ni­mi metodami za izračun kvadrata in kva­dra­tne­ga korena števila. Z de­ko­ra­tor­jem @staticmethod označimo square() in sqroot() kot statični metodi. Brez ustvar­ja­nja instance razreda pokličemo metode prek imena razreda. Rezultate Calculator.square() in Calculator.sqroot() združimo v f-nizu.

Pre­ver­ja­nje vnosov

Druga uporaba statične metode Python je pre­ver­ja­nje ve­ljav­no­sti vnosov.

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

Razred Validator obsega dve statični metodi: isInteger() in isDecimal(). Ti funkciji pre­ver­ja­ta, ali je dani vnos celo število ali decimalno število. Statična metoda Python isInteger() sprejme vnos in poskuša ga pre­tvo­ri­ti v celo število (int(num)). Če je uspešna, se vrne True. V na­spro­tnem primeru dobimo False, če je ujet izjemni primer ValueError, kar se zgodi, ko pre­ver­ja­nje ni mogoče.

Uporabimo metodo isDecimal(), da pre­tvo­ri­mo vhodno vrednost v decimalno število (float(num)). Če je pretvorba uspešna, se vrne True, sicer pa False. Nato uporabimo statični metodi isInteger() in isDecimal() razreda Validator, da preverimo vhodni vrednosti "123" in "3.14". Rezultati sta pravilni za obe funkciji.

Ma­ni­pu­la­ci­ja nizov

V spodnjem primeru de­fi­ni­ra­mo razred StringManipulation s statično metodo reverseText(). Ta sprejme besedilo kot parameter in uporabi sintakso za razrez [::-1], da obrne besedilo "Hello World!" in vrne rezultat.

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
Go to Main Menu