Opsi Pembekuan dan Perbandingan
Buat dataclass yang tidak dapat diubah dan terurut.
Opsi Pembekuan dan Perbandingan adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.
Opsi Dekorator
Dekorator @dataclass menerima argumen kata kunci yang mengendalikan metode yang dibuatnya. Opsi yang paling berguna adalah frozen dan order.
frozen=Truemembuat instans tidak dapat diubah.order=Truemenambahkan operator perbandingan.
Kelas Data Beku
Dengan frozen=True, kelas yang dibuat secara otomatis akan mencegah penetapan atribut setelah pembuatan. Setiap upaya tersebut akan memunculkan FrozenInstanceError.
from dataclasses import dataclass, FrozenInstanceError
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
try:
p.x = 99
except FrozenInstanceError as e:
print('Cannot modify:', e)Mengapa Ketidakberubahan Membantu
Objek yang tidak dapat diubah lebih mudah dipahami: nilainya tidak pernah berubah setelah dibuat, sehingga aman untuk dibagikan di antara fungsi dan thread. Objek tersebut juga aman digunakan sebagai kunci kamus dan anggota set.
Frozen Berarti Dapat Di-hash
Dataclass yang dibekukan secara default dapat di-hash, sehingga Anda dapat menggunakan instansnya dalam himpunan atau sebagai kunci kamus. Dataclass yang dapat diubah tidak dapat di-hash kecuali Anda mengaktifkannya secara eksplisit.
from dataclasses import dataclass
@dataclass(frozen=True)
class Point:
x: int
y: int
seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))Mengganti Nilai Frozen
Karena Anda tidak dapat mengubah instans yang dibekukan, gunakan dataclasses.replace() untuk membuat salinan yang telah dimodifikasi. Instans asli tetap tidak berubah.
from dataclasses import dataclass, replace
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)Dataclass Terurut
Secara default, dataclass hanya mendukung ==. Tambahkan order=True untuk membuat <, <=, >, dan >= juga.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))Cara Kerja Perbandingan Urutan
Pengurutan membandingkan atribut sebagai sebuah tuple, dari kiri ke kanan, sesuai urutan deklarasinya. Atribut pertama memiliki tingkat kepentingan tertinggi.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
# major compared first, then minor
print(Version(1, 9) < Version(2, 0))Mengurutkan Instans Dataclass
Karena dataclass terurut mendefinisikan operator perbandingan, Anda dapat langsung mengurutkan daftar instansnya dengan sorted().
from dataclasses import dataclass
@dataclass(order=True)
class Score:
points: int
name: str
data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
print(s)Mengontrol Kunci Pengurutan
Untuk mengurutkan berdasarkan sesuatu selain urutan atribut alami, letakkan atribut pengurutan tersembunyi di posisi pertama dengan field(init=False) dan tetapkan nilainya di __post_init__. Atribut lainnya dapat dikecualikan dari perbandingan dengan compare=False.
from dataclasses import dataclass, field
@dataclass(order=True)
class Item:
sort_index: int = field(init=False, repr=False)
name: str = field(compare=False, default='')
priority: int = 0
def __post_init__(self):
self.sort_index = self.priority
print(Item(name='b', priority=2) > Item(name='a', priority=1))Menggabungkan Pembekuan dan Pengurutan
Anda dapat menggabungkan berbagai opsi. Dataclass yang dibekukan dan terurut menghasilkan tipe nilai yang tidak dapat diubah serta dapat dibandingkan, sehingga ideal untuk kunci, nomor versi, atau koordinat.
from dataclasses import dataclass
@dataclass(frozen=True, order=True)
class SemVer:
major: int
minor: int
patch: int
versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])eq dan Nilai Bawaan
Opsi eq menentukan apakah __eq__ dibuat. Nilainya secara default adalah True. Perhatikan bahwa order=True memerlukan eq=True, karena pengurutan dibangun berdasarkan kesetaraan.
from dataclasses import dataclass
@dataclass(eq=True)
class Tag:
name: str
print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))Pemeriksaan Singkat
Apa yang terjadi jika Anda menetapkan nilai ke sebuah atribut pada instans dataclass yang dibekukan?
Rangkuman
Anda telah mempelajari cara membuat dataclass yang tidak dapat diubah dan terurut.
frozen=Truemencegah perubahan dan membuat instans dapat di-hash.- Gunakan
replace()untuk membuat salinan yang dimodifikasi. order=Truemembuat operator perbandingan yang membandingkan atribut sebagai tuple.- Gabungkan keduanya untuk membuat tipe nilai yang kokoh.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Opsi Pembekuan dan Perbandingan” gratis?
Ya — teks lengkap “Opsi Pembekuan dan Perbandingan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Opsi Pembekuan dan Perbandingan”?
Buat dataclass yang tidak dapat diubah dan terurut. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Python Academy?
Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Opsi Pembekuan dan Perbandingan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mendefinisikan Dataclass
- Nilai Default dan field()
- Opsi Pembekuan dan Perbandingan
- Pustaka attrs