0Pricing
Python Academy · Lekcja

Biblioteka attrs

Porównaj attrs z dataclasses

Biblioteka attrs to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Czym jest attrs?

attrs to biblioteka zewnętrzna, która wiele lat przed pojawieniem się dataclasses w bibliotece standardowej spopularyzowała koncepcję tworzenia klas na podstawie pól. Standardowy moduł dataclasses został bezpośrednio przez nią zainspirowany.

  • attrs wymaga osobnej instalacji: pip install attrs.
  • Oferuje więcej funkcji niż dataclasses.
  • dataclasses jest wbudowane i zaspokaja większość codziennych potrzeb.

Nowoczesne API attrs

Nowoczesne attrs korzysta z @define i field() z przestrzeni nazw attrs. Struktura jest bardzo podobna do dataclass.

from attrs import define, field

@define
class Point:
    x: int
    y: int

p = Point(1, 2)
print(p)

Domyślne użycie __slots__

Istnieje ważna różnica: klasy @define automatycznie używają __slots__. Zmniejsza to zużycie pamięci i zapobiega przypadkowemu dodawaniu niezadeklarowanych atrybutów. Zwykłe dataclasses używają standardowego __dict__, chyba że przekażą Państwo slots=True (Python 3.10+).

Wbudowane walidatory

attrs zawiera gotowe walidatory. Pole może deklarować walidator uruchamiany podczas tworzenia obiektu, który zgłasza błąd, jeśli wartość jest nieprawidłowa. Dataclasses nie mają wbudowanej walidacji — należy napisać ją samodzielnie w __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 TypeError

Konwertery

Konwerter przekształca wartość wejściową przed jej zapisaniem. Można na przykład automatycznie przekonwertować ciąg znaków na liczbę całkowitą. To kolejna funkcja, której brakuje w dataclasses.

from attrs import define, field

@define
class Item:
    price: int = field(converter=int)

i = Item('42')   # stored as the integer 42
print(i.price)

Odpowiednik w dataclasses

Oto ten sam pomysł z użyciem biblioteki standardowej. Walidację i konwersję należy ręcznie umieścić w __post_init__, ponieważ dataclasses nie udostępniają punktów zaczepienia dla poszczególnych pól.

from dataclasses import dataclass

@dataclass
class Item:
    price: int

    def __post_init__(self):
        self.price = int(self.price)

print(Item('42'))

asdict w obu bibliotekach

Obie biblioteki udostępniają pomocniczą funkcję asdict. Wersja dla dataclass znajduje się w module dataclasses, a wersja dla attrs — w module attrs. Ich działanie jest niemal identyczne.

from dataclasses import dataclass, asdict

@dataclass
class Point:
    x: int
    y: int

print(asdict(Point(1, 2)))

Zamrożenie w attrs

attrs również obsługuje niemutowalność. Należy użyć @frozen (skróconej wersji @define(frozen=True)), aby utworzyć instancje tylko do odczytu, podobnie jak w przypadku @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 FrozenInstanceError

Porównanie funkcji

Porównanie wygląda następująco:

  • dataclasses: biblioteka standardowa, bez konieczności instalacji, obejmuje podstawowe funkcje.
  • attrs: walidatory, konwertery, domyślne użycie slots i więcej możliwości konfiguracji.
  • Obie biblioteki generują __init__, __repr__ i __eq__.

Którego rozwiązania użyć?

Proszę wybrać dataclasses w przypadku prostych kontenerów danych, jeśli nie chcą Państwo dodawać zależności. Proszę wybrać attrs, gdy potrzebne są walidatory, konwertery lub bardziej rozbudowana konfiguracja i akceptują Państwo dodatkową zależność. Wiele projektów zaczyna od dataclasses i przechodzi na inne rozwiązanie dopiero wtedy, gdy ich możliwości przestają wystarczać.

Wspólne korzenie

Ponieważ dataclasses czerpie tak wiele z attrs, migracja między nimi jest zwykle mechaniczna: wystarczy zmienić import i dekorator oraz dostosować walidatory lub konwertery. Znajomość jednego rozwiązania sprawia, że drugie staje się od razu znajome.

  • @define odpowiada @dataclass.
  • attrs.field odpowiada dataclasses.field.
  • Przy przechodzeniu na dataclasses walidatory należy przenieść do __post_init__.

Szybkie sprawdzenie

Jaką funkcję oferuje attrs, której standardowy moduł dataclasses nie zapewnia wbudowanej?

Podsumowanie

Porównali Państwo attrs z dataclasses.

  • attrs zainspirowało dataclasses i oferuje więcej funkcji.
  • attrs dodaje walidatory, konwertery oraz domyślne użycie slots.
  • dataclasses jest wbudowane i nie wymaga instalacji.
  • Należy wybrać najprostsze narzędzie, które spełnia wymagania.

Często zadawane pytania

Czy lekcja „Biblioteka attrs” jest bezpłatna?

Tak — pełny tekst „Biblioteka attrs” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Biblioteka attrs”?

Porównaj attrs z dataclasses Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Biblioteka attrs”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Definiowanie dataclass
  2. Wartości domyślne i field()
  3. Opcje frozen i comparison
  4. Biblioteka attrs
← Powrót do Python Academy