Learn
← Previous Next →

Hari 19: Dunder Methods & Operator Overloading

60 min Last updated 26 Mar 2026

Apa itu Dunder Methods?

Dunder (double underscore) methods adalah method khusus Python yang dipanggil secara otomatis oleh operator atau fungsi built-in. Juga disebut magic methods.

__str__ & __repr__

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

    def __str__(self):       # untuk print() dan str()
        return f"({self.x}, {self.y})"

    def __repr__(self):      # untuk debugging, eval()
        return f"Titik({self.x}, {self.y})"

p = Titik(3, 4)
print(p)         # (3, 4)    — pakai __str__
print(repr(p))   # Titik(3, 4) — pakai __repr__
print([p])       # [Titik(3, 4)] — list pakai __repr__

Operator Overloading

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

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

    def __add__(self, other):      # v1 + v2
        return Vektor(self.x + other.x, self.y + other.y)

    def __sub__(self, other):      # v1 - v2
        return Vektor(self.x - other.x, self.y - other.y)

    def __mul__(self, scalar):     # v * 3
        return Vektor(self.x * scalar, self.y * scalar)

    def __rmul__(self, scalar):    # 3 * v
        return self.__mul__(scalar)

    def __len__(self):             # len(v) — panjang vektor (int)
        return int((self.x**2 + self.y**2) ** 0.5)

    def __eq__(self, other):       # v1 == v2
        return self.x == other.x and self.y == other.y

v1 = Vektor(1, 2)
v2 = Vektor(3, 4)
print(v1 + v2)    # (4, 6)
print(v2 - v1)    # (2, 2)
print(v1 * 3)     # (3, 6)
print(3 * v1)     # (3, 6)
print(len(v2))    # 5

Context Manager — __enter__ & __exit__

class Timer:
    import time as _time

    def __enter__(self):
        import time
        self._start = time.time()
        return self

    def __exit__(self, *args):
        import time
        self.elapsed = time.time() - self._start
        print(f"Waktu eksekusi: {self.elapsed:.4f}s")

with Timer():
    total = sum(range(1_000_000))

Dunder Lainnya

class KeranjangBelanja:
    def __init__(self):
        self.items = []

    def tambah(self, item):
        self.items.append(item)

    def __len__(self):         # len(keranjang)
        return len(self.items)

    def __contains__(self, item):  # "x" in keranjang
        return item in self.items

    def __iter__(self):        # for item in keranjang
        return iter(self.items)

    def __getitem__(self, idx):   # keranjang[0]
        return self.items[idx]

k = KeranjangBelanja()
k.tambah("Apel")
k.tambah("Mangga")
print(len(k))            # 2
print("Apel" in k)       # True
for item in k:
    print(item)
print(k[0])              # Apel

Assignment

Buat class Matriks 2x2 yang mendukung: penjumlahan (+), perkalian skalar (*), transpose (.T property), determinan (.det property), dan representasi string yang rapi.

Expected output:

M1:
| 1 2 |
| 3 4 |
det(M1) = -2
M1 + M2:
| 6 8 |
| 10 12 |
M1 * 3:
| 3 6 |
| 9 12 |
Transpose M1:
| 1 3 |
| 2 4 |
PY main.py
Solution
Output