attrs-biblioteket
Sammenlign attrs med dataclasses
attrs-biblioteket er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.
Hva er attrs?
attrs er et tredjepartsbibliotek som var først ute med ideen om å lage klasser fra felt, flere år før dataclasses kom inn i standardbiblioteket. Standardmodulen dataclasses ble direkte inspirert av det.
- attrs må installeres separat:
pip install attrs. - Det tilbyr flere funksjoner enn dataclasses.
- dataclasses er innebygd og dekker de fleste vanlige behov.
Det moderne attrs-API-et
Moderne attrs bruker @define og field() fra attrs-navnerommet. Strukturen ligner svært på en dataklasse.
from attrs import define, field
@define
class Point:
x: int
y: int
p = Point(1, 2)
print(p)Slots som standard
En viktig forskjell er at klasser med @define automatisk bruker __slots__. Dette reduserer minnebruken og hindrer at du ved et uhell legger til attributter som ikke er deklarert. Vanlige dataklasser bruker en ordinær __dict__ med mindre du angir slots=True (Python 3.10+).
Innebygde validatorer
attrs leveres med ferdige validatorer. Et felt kan angi en validator som kjøres under konstruksjonen og utløser en feil hvis verdien er ugyldig. Dataklasser har ingen innebygd validering; du må skrive den selv i __post_init__.
from attrs import define, field
from attrs.validators import instance_of
@define
class User:
age: int = field(validator=instance_of(int))
User(30) # ok
User('oops') # raises TypeErrorKonverterere
En konverterer endrer inngangsverdien før den lagres. Du kan for eksempel automatisk konvertere en streng til en int-verdi. Dette er en annen funksjon dataklasser mangler.
from attrs import define, field
@define
class Item:
price: int = field(converter=int)
i = Item('42') # stored as the integer 42
print(i.price)Dataklassevarianten
Her uttrykkes den samme ideen med standardbiblioteket. Validering og konvertering må legges inn manuelt i __post_init__, siden dataklasser ikke tilbyr koblingspunkter per felt.
from dataclasses import dataclass
@dataclass
class Item:
price: int
def __post_init__(self):
self.price = int(self.price)
print(Item('42'))asdict i begge
Begge bibliotekene tilbyr en hjelpefunksjon for asdict. Varianten for dataclasses ligger i dataclasses, mens varianten for attrs ligger i attrs. Virkemåten er nesten identisk.
from dataclasses import dataclass, asdict
@dataclass
class Point:
x: int
y: int
print(asdict(Point(1, 2)))Frozen i attrs
attrs støtter også uforanderlighet. Bruk @frozen (en kortform for @define(frozen=True)) for skrivebeskyttede instanser, på samme måte som med @dataclass(frozen=True).
from attrs import frozen
@frozen
class Point:
x: int
y: int
p = Point(1, 2)
print(p)
# p.x = 9 would raise FrozenInstanceErrorSammenligning av funksjoner
Slik skiller de seg:
- dataclasses: standardbiblioteket, ingen installasjon nødvendig, dekker det grunnleggende.
- attrs: validatorer, konverterere, slots som standard og flere konfigurasjonsmuligheter.
- Begge genererer
__init__,__repr__og__eq__.
Hva bør du velge?
Velg dataclasses for enkle dataholdere uten ekstra avhengigheter. Velg attrs når du trenger validatorer, konverterere eller de mer omfattende konfigurasjonsmulighetene, og er komfortabel med å legge til en avhengighet. Mange prosjekter begynner med dataclasses og går først over til attrs hvis de vokser ut av det.
En felles opprinnelse
Siden dataclasses har hentet så mye fra attrs, er det vanligvis en mekanisk prosess å migrere mellom dem: bytt importen og dekoratoren, og juster validatorer eller konverterere. Når du kan det ene, blir det andre umiddelbart kjent.
@definetilsvarer@dataclass.attrs.fieldtilsvarerdataclasses.field.- Validatorer flyttes inn i
__post_init__når du går over til dataclasses.
Kort sjekk
Hvilken funksjon tilbyr attrs som standardmodulen dataclasses ikke har innebygd?
Oppsummering
Du har sammenlignet attrs med dataclasses.
- attrs inspirerte dataclasses og tilbyr flere funksjoner.
- attrs legger til validatorer, konverterere og slots som standard.
- dataclasses er innebygd og krever ingen installasjon.
- Velg det enkleste verktøyet som dekker behovene dine.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 76
- Leksjoner
- 320
Ofte stilte spørsmål
Er leksjonen «attrs-biblioteket» gratis?
Ja – hele teksten i «attrs-biblioteket» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «attrs-biblioteket»?
Sammenlign attrs med dataclasses Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Python Academy?
Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «attrs-biblioteket»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?
Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Definere en dataklasse
- Standardverdier og field()
- Alternativer for frosne og sammenlignbare dataklasser
- attrs-biblioteket