முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 9 · பாடம் 2 இன் 4பாடத்திட்டத்தில் 34/36~12 min
தொகுதி பாடங்கள் (2/4)

தரவு வகுப்பு: கொதிகலன் இல்லாத தரவு வகுப்புகள்

@dataclass அலங்கரிப்பான் (dataclasses தொகுதி) தானாகவே உருவாக்குகிறது __init__, __repr__, மற்றும் __eq__ வகுப்புகளுக்கு பிடிப்பது மட்டுமே வேலை தரவு. குறைந்த கொதிகலன், தெளிவான குறியீடு.

தரவு வகுப்பு இல்லாமல் (பாய்லர் பிளேட்)

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)

தரவு வகுப்புடன்

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

முறை: புலங்களை வகுப்பு சிறுகுறிப்புகளாக அறிவிக்கவும் (name: type), விருப்பமாக ஒரு இயல்புநிலை மதிப்புடன். @dataclass மீதமுள்ளவற்றை உருவாக்குகிறது.

இயல்புநிலை மற்றும் default_factory

Python
from dataclasses import dataclass, field

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

உறைந்த=உண்மை: மாறாத

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

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

frozen தரவு வகுப்புகளும் ஹேஷபிள்: நீங்கள் அவற்றை டிக் கீகளாகப் பயன்படுத்தலாம் அல்லது கூறுகளை அமைக்கவும்.

ஒழுங்கு=உண்மை: தானியங்கி ஒப்பீடுகள்

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

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

__lt__, __le__, __gt__, __ge__ வரிசையில் உள்ள புலங்களை உருவாக்குகிறது அவை அறிவிக்கப்பட்டன.

சாதாரண முறைகள்

தரவு வகுப்புகள் வழக்கமான வகுப்புகளாகவே இருக்கும்: நீங்கள் முறைகளைச் சேர்க்கலாம்.

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

மாறாத மற்றும் திறமையான தரவு வகுப்புகள்

frozen=True என்ற வாதத்தை அலங்கரிப்பவருக்கு அனுப்புவதன் மூலம், நீங்கள் டேட்டாக்ளாஸை மாற்ற முடியாததாக மாற்றலாம்: @dataclass(frozen=True). இது உடனடிச் சூழலுக்குப் பிறகு பண்புகளை மாற்றுவதற்கான எந்தவொரு முயற்சியிலும் பிழையை எழுப்புகிறது.

நீங்களே முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#python.m9.l2.e1
முயற்சிகள்: 0ஏற்றுகிறது…

`தலைப்பு: str` மற்றும் `pages: int` புலங்களுடன் `புத்தகம்` என்ற தரவு வகுப்பை உருவாக்கவும். உடனடியாக அதை `l = Book('Moby Dick', 635)` என எழுதவும். `எல் == புத்தகம்('மொபி டிக்', 635)` என்பதை மதிப்பிடுக.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

@dataclass __eq__ ஐ புலம் வாரியாக ஒப்பிட்டு உருவாக்குகிறது.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

மதிப்பாய்வு பயிற்சி

உடற்பயிற்சி#python.m9.l2.e2
முயற்சிகள்: 0ஏற்றுகிறது…

`பொருட்கள்: பட்டியல்[str]` default_factory=list உடன் தரவு வகுப்பை `Basket` ​​ஐ உருவாக்கவும். உடனடியாக `c1 = Basket()` மற்றும் `c2 = Basket()`, 'mela' ஐ c1.items உடன் இணைக்கவும். அவை ஒரே பட்டியலில் இல்லை என்பதைச் சரிபார்க்க `(c1.items, c2.items)` மதிப்பாய்வு செய்யவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

புலம்(default_factory=list) ஒரு நிகழ்வுக்கு ஒரு புதிய பட்டியலுக்கு உத்தரவாதம் அளிக்கிறது.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

கூடுதல் சவால்

உடற்பயிற்சி#python.m9.l2.e3
முயற்சிகள்: 0ஏற்றுகிறது…

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`.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

வகுப்பு புள்ளிக்கு மேலே @dataclass ஐப் பயன்படுத்தவும், x: float மற்றும் y: float என அறிவிக்கவும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்