Middle
Dataclasses və namedtuple arasında oxşarlıqlar və fərqlər nədir?
sobes.tech Süni İntellekt
AI-dan cavab
dataclasses və namedtuple sadə məlumat strukturlarını yaratmaq üçün istifadə olunur, burada əsas məqsəd məlumatları saxlamaq və onlara adla müraciət etməkdir.
Oxşarlıqlar:
- Aydın şəkildə müəyyən edilmiş sahələrə malik sinflər yaratmağa imkan verir.
- Sahələrə adla giriş təmin edir (məsələn,
obj.field). - Avtomatik olaraq
__repr__metodlarını yaradır (istifadəçi dostu sətir təqdimatı üçün). - Unpacking (ayrıştırma) dəstəkləyir.
Fərqlər:
| Fərq | collections.namedtuple |
dataclasses.dataclass |
|---|---|---|
| Dəyişkənlik | Dəyişməz tip (immutable) | Standart olaraq dəyişkəndir, frozen=True ilə dəyişməz edilə bilər |
| Tip qeydiyyatı | Opsiyonaldır, tip annotasiyalarına əsaslanır | Zorunludur, tip annotasiyalarına əsaslanır |
| Miras | Tuple-ə əsaslanır, genişləndirmək çətindir | Tam sinflər, miras dəstəklənir |
| Funksionallıq | Yalnız məlumatların saxlanması, sadə repr | Daha çox imkanlar: __init__, __eq__, __hash__, __order__, standart dəyərlər olan sahələr, post-emal (__post_init__) |
| Python versiyası | Python 2 və 3-də mövcuddur | Python 3.7 və yuxarıda mövcuddur |
| Sintaksis | Sinfi qaytaran funksiya | @dataclass dekoratoru |
Nümunələr:
# namedtuple
from collections import namedtuple
PointNT = namedtuple('PointNT', ['x', 'y'])
p1 = PointNT(1, 2)
# p1.x = 10 # Xətaya səbəb olur, çünki dəyişməzdir
print(p1)
# dataclass
from dataclasses import dataclass, field
@dataclass
class PointDC:
x: int
y: int = 0 # Standart dəyər
z: int = field(init=False) # Avtomatik başlatılmayan sahə
def __post_init__(self):
self.z = self.x + self.y
p2 = PointDC(1)
print(p2)
p2.y = 5 # Dəyişkən
print(p2)
# Dəyişməz dataclass üçün
@dataclass(frozen=True)
class ImmutablePoint:
x: int
y: int
p3 = ImmutablePoint(3, 4)
# p3.x = 10 # Xətaya səbəb olur
print(p3)