Lompati ke konten utama
Modul 7 · Pelajaran 3 dari 427/36 dalam kursus~12 min
Pelajaran modul (3/4)

Metode khusus (dunder)

Metode khusus (disebut metode dunder karena dimulai dan diakhiri dengan garis bawah ganda: __name__) adalah pengait yang membiarkan benda Anda terintegrasi dengan bahasa: representasi teks, perbandingan dengan ==, dukungan untuk len(), in, operator, dll.

Anda sudah menggunakan satu: __init__.

__str__ dan __repr__

Mereka mengontrol apa yang muncul dengan print() dan di REPL.

Python
class Punto:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Punto({self.x}, {self.y})"

    def __str__(self):
        return f"({self.x}, {self.y})"

p = Punto(3, 4)
str(p)        # '(3, 4)'        — per umani
repr(p)       # 'Punto(3, 4)'   — per debugger / dev
print(p)      # '(3, 4)'
p             # Punto(3, 4)     in REPL → repr
[p, p]        # [Punto(3, 4), Punto(3, 4)]   — sempre repr nei contenitori

Jika Anda hanya mendefinisikan __repr__, Python juga menggunakannya sebagai cadangan __str__.

__eq__: mendefinisikan ulang ==

Secara default a == b membandingkan pengidentifikasi objek (is), bukan isinya. Untuk perbandingan struktural, tentukan __eq__:

Python
class Punto:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __eq__(self, other):
        if not isinstance(other, Punto):
            return NotImplemented
        return (self.x, self.y) == (other.x, other.y)

Punto(1, 2) == Punto(1, 2)    # True
Punto(1, 2) == Punto(3, 4)    # False

Mengembalikan NotImplemented (kata kunci khusus, bukan False!) saat mengetik tidak sebanding adalah praktik yang benar: Python kemudian akan mencoba dengan __eq__ operan lainnya.

__len__: dukungan untuk len()

Python
class Cesto:
    def __init__(self):
        self.frutti = []

    def __len__(self):
        return len(self.frutti)

c = Cesto()
c.frutti.append("mela")
len(c)        # 1
bool(c)       # True (len > 0)

Dengan mendefinisikan __len__, Anda juga mendapatkan boolean gratis: sebuah objek dengan len() == 0 menjadi salah.

Dunder berguna lainnya (ikhtisar)

  • __add__(self, other) → mendefinisikan ulang +
  • __lt__, __le__, __gt__, __ge__ → operator perbandingan
  • __contains__(self, item) → mendukung item in self
  • __iter__ + __next__ → membuat objek dapat diubah
  • __getitem__(self, key) → mendukung self[key]
  • __hash__ → harus berupa kunci dict / elemen set

Giliranmu

Latihan#python.m7.l3.e1
Upaya: 0Memuat…

Definisikan `Uang` dengan __init__(diri, jumlah, mata uang) dan __str__ yang mengembalikan `f'{amount} {currency}'`. Buat `s = Money(42, 'EUR')` dan evaluasi `str(s)`.

Memuat editor…
Tunjukkan petunjuk

f-string di __str__.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#python.m7.l3.e2
Upaya: 0Memuat…

Definisikan `Pair` dengan __init__(self, a, b) dan __eq__ berdasarkan perbandingan struktural (a, b). Evaluasi `Pasangan(1, 2) == Pasangan(1, 2)`.

Memuat editor…
Tunjukkan petunjuk

Bandingkan tupel (self.a, self.b) == (other.a, other.b).

Solusi tersedia setelah 3 upaya

Tantangan tambahan

Latihan#python.m7.l3.e3
Upaya: 0Memuat…

Definisikan kelas \`Buku\` dengan konstruktor yang mengambil \`judul\` dan \`penulis\`. Tentukan metode khusus \`__str__(self)\` sehingga mengembalikan string \`"Judul oleh Penulis"\` (misalnya \`'1984 oleh George Orwell'\`). Buat instance buku dan evaluasi \`str(book)\`.

Memuat editor…
Tunjukkan petunjuk

Gunakan f"{self.title} oleh {self.author}" di dalam def __str__(self):.

Solusi tersedia setelah 3 upaya