Ana içeriğe geç
Modül 9 · Ders 2 ders 4Kurstaki 34/36~12 min
Modül dersleri (2/4)

veri sınıfı: standart olmayan veri sınıfları

@dataclass dekoratörü (dataclasses modülü) otomatik olarak oluşturur Tek işi beklemek olan sınıflar için __init__, __repr__ ve __eq__ veriler. Daha az standart, daha net kod.

Veri sınıfı olmadan (ortak metin)

Python
class Punto:
    def __init__(self, x: float, y: float) -> None:
        self.x = x
        self.y = y
    def __repr__(self) -> str:
        return f"Punto(x={self.x}, y={self.y})"
    def __eq__(self, other) -> bool:
        if not isinstance(other, Punto):
            return NotImplemented
        return (self.x, self.y) == (other.x, other.y)

Veri sınıfı ile

Python
from dataclasses import dataclass

@dataclass
class Punto:
    x: float
    y: float

p = Punto(3, 4)
p             # Punto(x=3, y=4)   ← __repr__ gratis
Punto(3, 4) == Punto(3, 4)        # True ← __eq__ gratis
p.x, p.y      # 3, 4

Kalıp: alanları sınıf ek açıklamaları (name: type) olarak bildirin, isteğe bağlı olarak varsayılan bir değerle. @dataclass geri kalanını oluşturur.

Varsayılan ve default_factory

Python
from dataclasses import dataclass, field

@dataclass
class Articolo:
    nome: str
    prezzo: float = 0.0
    tag: list[str] = field(default_factory=list)

dondurulmuş=Doğru: değişmez

Python
@dataclass(frozen=True)
class Coordinata:
    lat: float
    lon: float

c = Coordinata(45.4, 9.2)
c.lat = 99   # FrozenInstanceError!

frozen veri sınıfları da hash edilebilir: bunları dict anahtarları olarak kullanabilirsiniz veya öğeleri ayarlayın.

sipariş=Doğru: otomatik karşılaştırmalar

Python
@dataclass(order=True)
class Voto:
    valore: int

Voto(10) < Voto(20)   # True
sorted([Voto(30), Voto(10), Voto(20)])

Sıradaki alanları karşılaştırarak __lt__, __le__, __gt__, __ge__ oluşturur ilan edildiler.

Normal yöntemler

Veri sınıfları normal sınıflar olarak kalır: yöntemler ekleyebilirsiniz.

Python
import math
from dataclasses import dataclass

@dataclass
class Punto:
    x: float
    y: float
    def distanza_dall_origine(self) -> float:
        return math.hypot(self.x, self.y)

Punto(3, 4).distanza_dall_origine()   # 5.0

Değişmez ve verimli veri sınıfları

frozen=True argümanını dekoratöre ileterek bir veri sınıfını değişmez hale getirebilirsiniz: @dataclass(frozen=True). Bu, örneklemeden sonra öznitelikleri değiştirmeye yönelik herhangi bir girişimde hataya neden olur ve örnekleri eşzamanlı ortamlar için veya sözlük anahtarları olarak kullanım için güvenli hale getirir.

Kendin dene

Egzersiz#python.m9.l2.e1
Denemeler: 0Yükleniyor…

'title: str' ve 'pages: int' alanlarıyla bir 'Kitap' veri sınıfı oluşturun. Bunu `l = Book('Moby Dick', 635)` olarak örnekleyin. `l == Book('Moby Dick', 635)` değerini değerlendirin.

Düzenleyici yükleniyor…
İpucu göster

@dataclass, alanları alanlarla karşılaştırarak __eq__ üretir.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#python.m9.l2.e2
Denemeler: 0Yükleniyor…

default_factory=list ile 'items: list[str]' alanıyla bir 'Basket' veri sınıfı oluşturun. `c1 = Basket()` ve `c2 = Basket()` örneklerini oluşturun, c1.items'e 'mela'yı ekleyin. Aynı liste OLMADIĞINI doğrulamak için `(c1.items, c2.items)` ifadesini değerlendirin.

Düzenleyici yükleniyor…
İpucu göster

field(default_factory=list) örnek başına yeni bir listeyi garanti eder.

3 denemeden sonra çözüm mevcut

Ek zorluk

Egzersiz#python.m9.l2.e3
Denemeler: 0Yükleniyor…

Import `dataclass` from `dataclasses`. Create a dataclass `Point` containing two float coordinates `x` and `y`. Instantiate a point with `x=1.5` and `y=2.5` storing it in `p`. Finally, evaluate `p`.

Düzenleyici yükleniyor…
İpucu göster

Point sınıfının üzerinde @dataclass kullanın ve x: float ve y: float'ı bildirin.

3 denemeden sonra çözüm mevcut