Jäädytys- ja vertailuasetukset
Luokaa muuttumattomia ja järjestettyjä dataclass-rakenteita.
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=Truetekee ilmentymistä muuttumattomia.order=Truelisää 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=Trueestää muuttamisen ja tekee instansseista hajautettavia.- Käyttäkää
replace()-funktiota muokattujen kopioiden tekemiseen. order=Trueluo vertailuoperaattorit, jotka vertailevat kenttiä monikkona.- Yhdistämällä molemmat saatte vankkoja arvotyyppejä.
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
- Dataclassin määrittäminen
- Oletusarvot ja field()
- Jäädytys- ja vertailuasetukset
- attrs-kirjasto