Oletusarvot ja field()
Asettakaa oletusarvot ja käyttäkää field()-asetuksia.
Oletusarvot ja field() on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/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.
Kenttien oletusarvojen määrittäminen
Aivan kuten funktion parametreilla, myös dataclass-kentillä voi olla oletusarvoja. Oletusarvon sisältävä kenttä voidaan jättää pois ilmentymää luotaessa.
from dataclasses import dataclass
@dataclass
class Server:
host: str
port: int = 8080
print(Server('localhost'))
print(Server('example.com', 443))Järjestyksellä on väliä
Oletusarvon sisältävien kenttien on oltava oletusarvottomien kenttien jälkeen aivan kuten funktioargumenteissa. Muussa tapauksessa Python nostaa TypeError-virheen luokan määrittelyn yhteydessä.
from dataclasses import dataclass
@dataclass
class User:
name: str # required
active: bool = True # optional
print(User('Alice'))Muuttuvan oletusarvon sudenkuoppa
Muuttuvaa oliota, kuten listaa tai sanakirjaa, ei voi käyttää suoraan oletusarvona. Tällöin kaikki ilmentymät jakaisivat saman olion. Python havaitsee tämän ja nostaa ValueError-virheen suojatakseen teitä.
from dataclasses import dataclass
from typing import List
# This raises ValueError at class definition time:
try:
@dataclass
class Bad:
items: List[int] = []
except ValueError as e:
print('Error:', e)field(default_factory=...)
Antakaa muuttuvalle kentälle oletusarvo käyttämällä field(default_factory=...)-määritystä. Tehdasfunktiota kutsutaan jokaisen uuden ilmentymän kohdalla, joten jokainen ilmentymä saa oman uuden olionsa.
from dataclasses import dataclass, field
from typing import List
@dataclass
class Cart:
items: List[str] = field(default_factory=list)
a = Cart()
a.items.append('apple')
b = Cart()
print(a.items, b.items)default ja default_factory
Käyttäkää field(default=...)-määritystä muuttumattomille arvoille, kun tarvitsette samalla muita field()-asetuksia. Käyttäkää default_factory-asetusta kaikille muuttuvalle arvoille. Molempia ei voi antaa yhtä aikaa.
from dataclasses import dataclass, field
@dataclass
class Config:
retries: int = field(default=3)
tags: list = field(default_factory=list)
print(Config())Kentän jättäminen pois repr-esityksestä
repr=False-asetus piilottaa kentän automaattisesti luodusta __repr__-esityksestä. Tämä on hyödyllistä salaisuuksille tai suurille sisäisille puskureille.
from dataclasses import dataclass, field
@dataclass
class Account:
user: str
token: str = field(repr=False, default='secret')
print(Account('alice'))Kentän jättäminen pois vertailusta
Kun käytätte asetusta compare=False, kenttä jätetään automaattisesti luodun __eq__-metodin (ja järjestysvertailun) ulkopuolelle. Kaksi ilmentymää voivat olla yhtäsuuret, vaikka kyseinen kenttä olisi erilainen.
from dataclasses import dataclass, field
@dataclass
class Event:
name: str
timestamp: float = field(compare=False, default=0.0)
print(Event('login', 1.0) == Event('login', 99.0))init=False-kentät
Asetus init=False jättää kentän __init__-metodin ulkopuolelle. Yleensä yhdistätte sen oletusarvoon tai asetatte arvon __post_init__-metodissa.
from dataclasses import dataclass, field
@dataclass
class Circle:
radius: float
area: float = field(init=False, default=0.0)
c = Circle(2.0)
print(c)__post_init__ johdettujen arvojen laskemiseen
Määrittäkää __post_init__, jos haluatte suorittaa koodia heti automaattisesti luodun __init__-metodin jälkeen. Se on luonteva paikka muista kentistä johdettujen kenttien laskemiseen.
from dataclasses import dataclass, field
@dataclass
class Circle:
radius: float
area: float = field(init=False, default=0.0)
def __post_init__(self):
self.area = 3.14159 * self.radius ** 2
print(Circle(2.0))Metatietojen tallentaminen
metadata-argumentti liittää kenttään mielivaltaisen kuvausjoukon. Python jättää sen huomiotta, mutta työkalut ja oma koodinne voivat lukea sitä dokumentointia tai validointia koskevia vihjeitä varten.
from dataclasses import dataclass, field, fields
@dataclass
class Product:
price: float = field(metadata={'unit': 'USD'})
for f in fields(Product):
print(f.name, f.metadata)field()-asetusten yhdistäminen
Asetuksia voi yhdistää. Yksi kenttä voidaan piilottaa repr-esityksestä, jättää vertailun ulkopuolelle ja varustaa oletusarvolla samanaikaisesti.
from dataclasses import dataclass, field
@dataclass
class Session:
user: str
token: str = field(default='x', repr=False, compare=False)
print(Session('alice'))
print(Session('alice') == Session('alice', token='different'))Pikatarkistus
Miten dataclass-kentälle annetaan oletusarvoksi tyhjä lista?
Kertaus
Opitte määrittämään oletusarvoja ja käyttämään field()-asetuksia.
- Oletusarvolliset kentät tulevat pakollisten kenttien jälkeen.
- Käyttäkää
default_factory-asetusta muuttuville oletusarvoille. repr-,compare-,init- jametadata-asetuksilla säädetään kunkin kentän toimintaa.__post_init__laskee johdetut arvot.
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 ”Oletusarvot ja field()” ilmainen?
Kyllä – oppitunnin ”Oletusarvot ja field()” 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 ”Oletusarvot ja field()”?
Asettakaa oletusarvot ja käyttäkää field()-asetuksia. 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 2/4.
Kuinka kauan ”Oletusarvot ja field()”-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