Python Academy · Oppitunti

@classmethod ja @staticmethod

Määrittäkää luokka- ja staattisia metodeja sopivilla dekoraattoreilla.

Oppitunti 4/414 vaihetta

@classmethod ja @staticmethod on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

Johdanto

@classmethod vastaanottaa luokan ensimmäisenä argumenttina. @staticmethod ei vastaanota mitään erityistä argumenttia. Molemmat määritellään luokassa.

Instanssi-, luokka- ja staattiset metodit

Tavalliset metodit saavat self-argumentin. Luokkametodit saavat cls-argumentin. Staattiset metodit eivät saa kumpaakaan. Valitkaa menetelmä tarvitsemienne tietojen perusteella.
class Demo:
    def instance(self): return 'instance'
    @classmethod
    def class_m(cls): return f'class: {cls.__name__}'
    @staticmethod
    def static_m(): return 'static'
d = Demo()
print(d.instance())
print(Demo.class_m())
print(Demo.static_m())

@classmethod tehdasfunktiona

Yleisin käyttötapa on vaihtoehtoiset konstruktorit. Date.from_string('2024-01-15') on vaihtoehto __init__-metodissa jäsentämiselle.
class Date:
    def __init__(self, y,m,d): self.y,self.m,self.d=y,m,d
    @classmethod
    def today(cls):
        from datetime import date
        d = date.today()
        return cls(d.year, d.month, d.day)
    def __repr__(self): return f'{self.y}-{self.m}-{self.d}'
print(Date.today())

@classmethod ja perintä

Luokkametodin cls viittaa todelliseen aliluokkaan, ei perusluokkaan. Näin tehdasmetodit toimivat oikein myös aliluokkien kanssa.
class Animal:
    @classmethod
    def create(cls, name):
        return cls(name)
    def __init__(self, name): self.name = name
class Dog(Animal): pass
d = Dog.create('Rex')
print(type(d).__name__, d.name)

@staticmethod apufunktioille

Staattiset metodit ovat tavallisia funktioita, jotka on loogisesti ryhmitelty luokan yhteyteen. Ne eivät voi käyttää luokan tai instanssin tietoja.
class MathHelper:
    @staticmethod
    def clamp(value, lo, hi):
        return max(lo, min(hi, value))
print(MathHelper.clamp(15, 0, 10))
print(MathHelper.clamp(-5, 0, 10))

@staticmethod vs. moduulifunktio

Jos funktio ei tarvitse luokkaa, se voisi olla moduulitason funktio. Käyttäkää @staticmethod-koristetta vain, kun funktio kuuluu loogisesti luokkaan.
class Validator:
    @staticmethod
    def is_email(s): return '@' in s and '.' in s
print(Validator.is_email('user@example.com'))
print(Validator.is_email('not-an-email'))

Kutsuminen instanssista

Voitte kutsua sekä @classmethod- että @staticmethod-metodeja instansseista, mutta cls-argumentin ja ensimmäisen argumentin puuttumisen toiminta ei muutu.
class C:
    @classmethod
    def who(cls): return cls.__name__
    @staticmethod
    def pi(): return 3.14
c = C()
print(c.who())
print(c.pi())

Luokkametodi singleton-toteutuksiin

Luokkametodeilla voidaan toteuttaa singleton-malli tarkistamalla, onko instanssi jo olemassa.
class Singleton:
    _instance = None
    @classmethod
    def get(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
a = Singleton.get()
b = Singleton.get()
print(a is b)

Luokkametodien ylikirjoittaminen

Aliluokka voi ylikirjoittaa luokkametodin. Tällöin cls on aliluokka, joten polymorfismi säilyy.
class Base:
    @classmethod
    def info(cls): return f'{cls.__name__} info'
class Child(Base): pass
print(Base.info())
print(Child.info())

Tyyppitarkistus cls:n avulla

Luokkametodin sisällä cls on todellinen luokka. Luokaa instansseja käyttämällä cls()-ilmausta — älkää määrittäkö luokan nimeä kiinteästi.
class Shape:
    @classmethod
    def make(cls):
        return cls()  # NOT Shape()
class Square(Shape): pass
print(type(Square.make()).__name__)

Yhdistäminen @property-koristeeseen

Luokkatasoinen välimuistissa säilytettävä arvo voidaan yhdistää @classmethod-koristeeseen ja luokka-attribuuttiin luokan laajuista välimuistia varten.
class Config:
    _data = None
    @classmethod
    def load(cls):
        if cls._data is None:
            cls._data = {'debug': True}
        return cls._data
print(Config.load())

Pikatarkistus

Mikä cls on @classmethod-metodissa?

Kertaus

@classmethod saa cls-argumentin: käyttäkää sitä tehtaisiin, vaihtoehtoisiin konstruktoreihin ja singleton-toteutuksiin. @staticmethod ei saa mitään erityistä argumenttia: käyttäkää sitä apufunktioihin. cls on todellinen luokka tai aliluokka.

Jatkakaa

Edistytte erinomaisesti! Jatkakaa, jotta hallitsette seuraavan käsitteen.
Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”@classmethod ja @staticmethod” ilmainen?

Kyllä – oppitunnin ”@classmethod ja @staticmethod” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”@classmethod ja @staticmethod”?

Määrittäkää luokka- ja staattisia metodeja sopivilla dekoraattoreilla. Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”@classmethod ja @staticmethod”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?

Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Funktiot ensiluokkaisina olioina
  2. Mukautettujen dekoraattorien kirjoittaminen
  3. @property-dekoraattori
  4. @classmethod ja @staticmethod
← Takaisin: Python Academy