Standardværdier og field()
Angiv standardværdier, og brug indstillingerne i field().
Standardværdier og field() er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.
Tildeling af standardværdier til felter
Ligesom funktionsparametre kan dataclass-felter have standardværdier. Et felt med en standardværdi kan udelades, når du opretter en instans.
from dataclasses import dataclass
@dataclass
class Server:
host: str
port: int = 8080
print(Server('localhost'))
print(Server('example.com', 443))Rækkefølgen er vigtig
Felter med standardværdier skal komme efter felter uden standardværdier, præcis som funktionsargumenter. Ellers udløser Python en TypeError, når klassen defineres.
from dataclasses import dataclass
@dataclass
class User:
name: str # required
active: bool = True # optional
print(User('Alice'))Fælden med foranderlige standardværdier
Du kan ikke bruge et foranderligt objekt som en liste eller ordbog som en direkte standardværdi. Alle instanser ville dele det samme objekt. Python registrerer dette og udløser en ValueError for at beskytte dig.
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=...)
Hvis du vil give et foranderligt objekt en standardværdi, skal du bruge field(default_factory=...). Fabrikken kaldes for hver ny instans, så hver instans får sit eget nye objekt.
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 kontra default_factory
Brug field(default=...) til uforanderlige værdier, når du også har brug for andre indstillinger til field(). Brug default_factory til alt, der kan ændres. Du kan ikke angive begge dele på samme tid.
from dataclasses import dataclass, field
@dataclass
class Config:
retries: int = field(default=3)
tags: list = field(default_factory=list)
print(Config())Udelad et felt fra repr
Indstillingen repr=False skjuler et felt fra den genererede __repr__. Det er nyttigt til hemmeligheder eller store interne buffere.
from dataclasses import dataclass, field
@dataclass
class Account:
user: str
token: str = field(repr=False, default='secret')
print(Account('alice'))Udelad et felt fra sammenligning
Med compare=False ignoreres et felt af den genererede __eq__ (og ved sortering). To instanser kan være ens, selvom feltet er forskelligt.
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))Felter med init=False
Hvis du angiver init=False, holdes feltet ude af __init__. Du kombinerer det normalt med en standardværdi eller indstiller det i __post_init__.
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__ til afledte værdier
Definér __post_init__ for at køre kode lige efter den genererede __init__. Det er det naturlige sted at beregne felter, der er afledt af andre felter.
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))Lagring af metadata
Argumentet metadata knytter en vilkårlig mapping til et felt. Python ignorerer den, men værktøjer og din egen kode kan læse den for at få dokumentation eller tip til validering.
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)Kombination af field()-indstillinger
Indstillingerne kan kombineres. Et enkelt felt kan skjule sig fra repr, holdes ude af sammenligning og samtidig have en standardværdi.
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'))Hurtigt tjek
Hvordan giver du et dataclass-felt en tom liste som standardværdi?
Opsummering
Du har lært at angive standardværdier og bruge indstillingerne i field().
- Felter med standardværdier kommer efter obligatoriske felter.
- Brug
default_factorytil foranderlige standardværdier. repr,compare,initogmetadatafinjusterer hvert felt.__post_init__beregner afledte værdier.
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 76
- Lektioner
- 320
Ofte stillede spørgsmål
Er lektionen “Standardværdier og field()” gratis?
Ja — hele teksten til “Standardværdier og field()” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Standardværdier og field()”?
Angiv standardværdier, og brug indstillingerne i field(). Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Python Academy?
Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Standardværdier og field()”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Python Academy-lektion?
Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Definér en dataclass
- Standardværdier og field()
- Indstillinger for frozen og sammenligning
- attrs-biblioteket