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.
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 contenitoriJika 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__:
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) # FalseMengembalikan 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()
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)→ mendukungitem in self__iter__+__next__→ membuat objek dapat diubah__getitem__(self, key)→ mendukungself[key]__hash__→ harus berupa kunci dict / elemen set
Giliranmu
Definisikan `Uang` dengan __init__(diri, jumlah, mata uang) dan __str__ yang mengembalikan `f'{amount} {currency}'`. Buat `s = Money(42, 'EUR')` dan evaluasi `str(s)`.
Tunjukkan petunjuk
f-string di __str__.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Definisikan `Pair` dengan __init__(self, a, b) dan __eq__ berdasarkan perbandingan struktural (a, b). Evaluasi `Pasangan(1, 2) == Pasangan(1, 2)`.
Tunjukkan petunjuk
Bandingkan tupel (self.a, self.b) == (other.a, other.b).
Solusi tersedia setelah 3 upaya
Tantangan tambahan
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)\`.
Tunjukkan petunjuk
Gunakan f"{self.title} oleh {self.author}" di dalam def __str__(self):.
Solusi tersedia setelah 3 upaya