Python Academy · Oppitunti

Jäädytys- ja vertailuasetukset

Luokaa muuttumattomia ja järjestettyjä dataclass-rakenteita.

Oppitunti 3/413 vaihetta

Jäädytys- ja vertailuasetukset on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Dekoraattorin asetukset

@dataclass-dekoraattori hyväksyy avainsana-argumentteja, joilla hallitaan sen automaattisesti luomia metodeja. Hyödyllisimmät ovat frozen ja order.

  • frozen=True tekee ilmentymistä muuttumattomia.
  • order=True lisää vertailuoperaattorit.

Muuttumattomat dataclass-luokat

Kun käytätte asetusta frozen=True, luotu luokka estää attribuuttien sijoittamisen olion luonnin jälkeen. Kaikki yritykset nostavat FrozenInstanceError-virheen.

from dataclasses import dataclass, FrozenInstanceError

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
try:
    p.x = 99
except FrozenInstanceError as e:
    print('Cannot modify:', e)

Muuttumattomuuden hyödyt

Muuttumattomia olioita on helpompi käsitellä: niiden arvo ei muutu luonnin jälkeen, joten niitä on turvallista jakaa funktioiden ja säikeiden välillä. Niitä on myös turvallista käyttää sanakirjojen avaimina ja joukkojen jäseninä.

Frozen tarkoittaa hajautettavaa

Jäädytetty dataclass on oletusarvoisesti hajautettava, joten sen instansseja voi käyttää joukoissa tai sanakirjan avaimina. Muuttuvat dataclassit eivät ole hajautettavia, ellette ota tätä ominaisuutta erikseen käyttöön.

from dataclasses import dataclass

@dataclass(frozen=True)
class Point:
    x: int
    y: int

seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))

Jäädytettyjen arvojen korvaaminen

Koska jäädytettyä instanssia ei voi muuttaa, käyttäkää dataclasses.replace()-funktiota muokatun kopion tekemiseen. Alkuperäinen säilyy muuttumattomana.

from dataclasses import dataclass, replace

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)

Järjestetyt dataclassit

Dataclass tukee oletusarvoisesti vain operaattoria ==. Lisää order=True, niin se luo myös operaattorit <, <=, > ja >=.

from dataclasses import dataclass

@dataclass(order=True)
class Version:
    major: int
    minor: int

print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))

Miten järjestystä verrataan

Järjestys vertailee kenttiä monikkona vasemmalta oikealle niiden määrittelyjärjestyksessä. Ensimmäinen kenttä on merkitsevin.

from dataclasses import dataclass

@dataclass(order=True)
class Version:
    major: int
    minor: int

# major compared first, then minor
print(Version(1, 9) < Version(2, 0))

Dataclass-instanssien lajittelu

Koska järjestetyt dataclassit määrittelevät vertailuoperaattorit, niiden luettelon voi lajitella suoraan funktiolla sorted().

from dataclasses import dataclass

@dataclass(order=True)
class Score:
    points: int
    name: str

data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
    print(s)

Lajitteluavaimen hallinta

Jos haluatte lajitella jonkin muun kuin kenttien luonnollisen järjestyksen perusteella, lisätkää ensimmäiseksi piilotettu lajittelukenttä käyttämällä field(init=False)-määritystä ja asettakaa sen arvo __post_init__-metodissa. Muut kentät voi jättää vertailun ulkopuolelle käyttämällä compare=False-määritystä.

from dataclasses import dataclass, field

@dataclass(order=True)
class Item:
    sort_index: int = field(init=False, repr=False)
    name: str = field(compare=False, default='')
    priority: int = 0

    def __post_init__(self):
        self.sort_index = self.priority

print(Item(name='b', priority=2) > Item(name='a', priority=1))

frozen- ja order-asetusten yhdistäminen

Voitte yhdistää asetuksia. Jäädytetty ja järjestetty dataclass muodostaa erinomaisen muuttumattoman ja vertailtavan arvotyypin, joka sopii hyvin avaimiksi, versionumeroiksi tai koordinaateiksi.

from dataclasses import dataclass

@dataclass(frozen=True, order=True)
class SemVer:
    major: int
    minor: int
    patch: int

versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])

eq ja oletusarvo

eq-asetus määrittää, luodaanko __eq__. Sen oletusarvo on True. Huomaa, että order=True edellyttää asetusta eq=True, koska järjestys perustuu yhtäsuuruuteen.

from dataclasses import dataclass

@dataclass(eq=True)
class Tag:
    name: str

print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))

Pikatarkistus

Mitä tapahtuu, jos määritätte uuden arvon jäädytetyn dataclass-instanssin kentälle?

Kertaus

Opitte tekemään muuttumattomia ja järjestettyjä dataclass-instansseja.

  • frozen=True estää muuttamisen ja tekee instansseista hajautettavia.
  • Käyttäkää replace()-funktiota muokattujen kopioiden tekemiseen.
  • order=True luo vertailuoperaattorit, jotka vertailevat kenttiä monikkona.
  • Yhdistämällä molemmat saatte vankkoja arvotyyppejä.
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 ”Jäädytys- ja vertailuasetukset” ilmainen?

Kyllä – oppitunnin ”Jäädytys- ja vertailuasetukset” 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 ”Jäädytys- ja vertailuasetukset”?

Luokaa muuttumattomia ja järjestettyjä dataclass-rakenteita. 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 3/4.

Kuinka kauan ”Jäädytys- ja vertailuasetukset”-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. Dataclassin määrittäminen
  2. Oletusarvot ja field()
  3. Jäädytys- ja vertailuasetukset
  4. attrs-kirjasto
← Takaisin: Python Academy