Датакласстар жана аталган кортеждер
Шаблондук коддун ашыкча жүгүсүз структуралуу жазуулар
Негизги идея: Датакласс — бул кадимки класс, анын кайталанма кызматтык коду —
__init__, __repr__, __eq__ жана башкалар — тип аннотацияланган талаалардан сиз үчүн генерацияланат. Аталган кортеж (namedtuple) — бул позициялары да атка ээ болгон өзгөрбөс кортеж. Экөө тең байланышкан бир нече талаанын чакан топтомун так моделдештирүүгө мүмкүндүк берет; андан ары кеп кайсы куралды тандоо жана аны field() менен frozen=True аркылуу башкаруу жөнүндө болот.
Аягында сиз мына мунуларды жасай аласыз:
- кол менен жазылган
__init__/__repr__/__eq__ордуна@dataclassколдонуу, - талааларга демейки маанилерди коопсуз берүү, анын ичинде өзгөрмө маанилерди
field(default_factory=...)аркылуу, - жазууларды
frozen=Trueменен өзгөрбөс жана хештелүүчү кылуу, - айрым талааларды
field()аркылуу тууралоо (repr,compare,init,kw_only), - датакласс,
NamedTuple, кадимки класс жана сөздүктүн ортосунан тапшырмага жараша тандоо.
1. Шаблондук код көйгөйү
Кичине жазуу классын кол менен жазганды сиз мурунтан билесиз. Кыйынчылык — үч талаалуу жазуу да ар бир атты акылга сыярлык куруу, чыгаруу жана салыштыруу үчүн гана үч-төрт жолу кайталоого мажбурлайт.
class Point:
def __init__(self, x: float, y: float):
self.x = x
self.y = y
def __repr__(self):
return f"Point(x={self.x}, y={self.y})"
def __eq__(self, other):
if not isinstance(other, Point):
return NotImplemented
return (self.x, self.y) == (other.x, other.y)
«x жана y» үчүн бул өтө көп расмийлик. __eq__ унутсаңыз, эки бирдей чекит бирдей эмес болуп чыгат; __repr__ унутсаңыз, логдо <Point object at 0x...> көрүнөт. Датакласстар так ушул кызматтык кодду аннотациялардан генерациялайт.