Staatilised ja klassimeetodid Pythonis

Sissejuhatus

Python võimaldab teil defineerida staatilisi ja klassimeetodeid, mis on spetsiaalsed funktsioonid, mis kuuluvad klassi, mitte selle eksemplarile (objektile). Staatilised meetodid on seotud kogu klassiga ja neid saab kutsuda ilma objekti loomata, samal ajal kui klassimeetodid on seotud klassi tervikuna.

Staatilised meetodid

Staatilised meetodid on meetodid, mis kuuluvad klassile, mitte selle eksemplarile. Neid saab kutsuda klassinimi.meetod() kaudu. Staatilisi meetodeid kasutatakse sageli, kui meetod ei sõltu klassi eksemplari olekust, kuid on loogiliselt seotud klassiga.

Klassimeetodid

Klassimeetodid on meetodid, mis kuuluvad klassile, mitte eksemplarile, kuid saavad ligi klassi enda atribuutidele. Neid saab kutsuda klassinimi.meetod() kaudu. Klassimeetodeid kasutatakse sageli, kui on vaja luua meetodeid, mis mõjutavad klassi atribuute, kuid ei sõltu konkreetsest eksemplarist.

Koodinäited

Staatilised meetodid:

class MathUtility:
    @staticmethod
    def add(x, y):
        return x + y

result = MathUtility.add(3, 5)
print(result)

# Väljund:
# 8

Klassimeetodid:

class Dog:
    total_dogs = 0

    def __init(self, name):
        self.name = name
        Dog.total_dogs += 1

    @classmethod
    def show_total_dogs(cls):
        return cls.total_dogs

dog1 = Dog("Rex")
dog2 = Dog("Buddy")
total = Dog.show_total_dogs()
print(f"Kokku koeri: {total}")

# Väljund:
# Kokku koeri: 2

Rohkem staatilistest meetoditest

Staatilised meetodid on meetodid, mis kuuluvad klassile, mitte selle eksemplarile, ja neid saab kutsuda ilma objekti loomata. Need meetodid on kasulikud olukordades, kus meetod ei sõltu klassi eksemplari olekust ega kasuta selle atribuute.

Staatilisi meetodeid saab määratleda klassi sees kasutades @staticmethod dekoratsiooni. Selle dekoratsiooni abil märgistatakse meetod staatiliseks ja see muutub seotuks kogu klassiga, mitte ühegi konkreetse eksemplariga.

Staatilised meetodid aitavad parandada koodi loetavust ja struktuuri, eriti juhul, kui klassis on palju meetodeid, mis ei sõltu eksemplari olekust, kuid on siiski seotud klassi endaga.

Staatilised meetodid iseseisvate funktsioonide jaoks

Staatilised meetodid sobivad ideaalselt iseseisvate funktsioonide loomiseks klassis. Staatilised meetodid ei saa kasutada klassi ega eksemplari olekut, mis muudab nad iseseisvateks ja selgelt näitab, et nad ei muuda klassi ega eksemplari omadusi. Seda piirangut järgib Pythoni interpretaator ja see on väärtuslik viis arendaja kavatsuse edastamiseks.

Staatiliste meetodite ja klassimeetodite abil saate luua selgeid piire oma klassiarhitektuuris, mis muudab selle mõistmise ja hooldamise lihtsamaks. Lisaks on staatiliste meetodite kasutamine testikoodi kirjutamisel kasulik, kuna neid saab iseseisvalt testida, ilma et peaksite täielikku klassi eksemplari looma.

Pärilikkus

Staatilised meetodid käituvad nagu tavalised funktsioonid pärinedes. Nad ei tea midagi objekti eksemplaarist ega klassist, milles nad on.

Klassimeetodid parameetrid muutuvad kui kutsuda alamklassist. Klassifunktsiooniga kaasa tulev cls muutuja viitab alamklassile, mitte ülemklassile.

Mõlemad meetodid lubavad meetodite varjamist, ehk saad defineerida sama nimega meetodi, mis saab midagi muud teha. See erineb ülekirjutamisest kuna sisemiselt on ikka olemas ülemklassi meetod, aga see on peidetud alamklassi meetodi nime taga. (Selleks, et kutsuda ülemklassi meetodit saab kasutada super() meetodit)

class MyClass:
    def __init__(self):
        pass

    @classmethod
    def class_method(cls):
        print("Superclass method")

    @staticmethod
    def static_method():
        print("Superclass Static")


class MySubClass(MyClass):
    def __init__(self):
        MyClass.__init__(self)

    @classmethod
    def class_method(cls):
        print("Subclass method")

    @staticmethod
    def static_method():
        print("Subclass Static")

    def super_class_access(self):
        super().class_method()
        super().static_method()


base = MyClass()
base.class_method()         # Superclass method
base.static_method()        # Superclass Static
sub = MySubClass()
sub.class_method()          # Subclass method
sub.static_method()         # Subclass Static

sub.super_class_access()    # Superclass method
                            # Superclass Static

Kokkuvõte

  • Eksemplarimeetodid vajavad klassi eksemplari ja pääsevad sellele ligi kasutades self.

  • Klassimeetodid ei vaja klassi eksemplari. Neil on juurdepääs klassile endale läbi cls.

  • Staatilistel meetoditel pole juurdepääsu ei cls ega self. Need käituvad nagu tavalised funktsioonid, kuid kuuluvad klassi nimeruumi.

  • Staatilised ja klassimeetodid aitavad edastada ja (teatud määral) rakendada arendaja kavatsust klassi kujunduse osas, mis võib kaasa tuua hoolduseelised.

Lisaks infot

Lisateabe saamiseks staatiliste ja klassimeetodite kohta Pythonis vaadake järgmist linki: lisaks infot.