0Pricing
Python Academy · Pelajaran

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=True membuat instans tidak dapat diubah.
  • order=True menambahkan 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=True mencegah perubahan dan membuat instans dapat di-hash.
  • Gunakan replace() untuk membuat salinan yang dimodifikasi.
  • order=True membuat 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

  1. Mendefinisikan Dataclass
  2. Nilai Default dan field()
  3. Opsi Pembekuan dan Perbandingan
  4. Pustaka attrs
← Kembali ke Python Academy