Learn
← Previous Next →

Hari 17: OOP — Class, Object & __init__

65 min Last updated 26 Mar 2026

Paradigma OOP

OOP mengorganisasi kode sebagai kumpulan objek yang memiliki atribut (data) dan method (perilaku). Empat pilar: Encapsulation, Inheritance, Polymorphism, Abstraction.

# Class = blueprint/cetakan
# Object = instansi dari class

class Mobil:
    # Class attribute — shared oleh semua objek
    roda = 4

    # __init__ = constructor, dipanggil saat objek dibuat
    def __init__(self, merek, model, tahun, warna="Putih"):
        # Instance attribute — unik per objek
        self.merek = merek
        self.model = model
        self.tahun = tahun
        self.warna = warna
        self.km    = 0
        self._nyala = False   # konvensi private

    # Instance method
    def info(self):
        return f"{self.tahun} {self.merek} {self.model} ({self.warna})"

    def nyalakan(self):
        if not self._nyala:
            self._nyala = True
            print(f"{self.merek} dinyalakan. Vroom!")
        else:
            print("Mobil sudah menyala")

    def jalan(self, jarak):
        if not self._nyala:
            print("Nyalakan dulu mobilnya!")
            return
        self.km += jarak
        print(f"Melaju {jarak} km. Total: {self.km} km")

# Membuat objek
m1 = Mobil("Toyota", "Avanza", 2022)
m2 = Mobil("Honda", "Brio", 2023, "Merah")

print(m1.info())
m1.nyalakan()
m1.jalan(50)
m1.jalan(30)
print(f"Roda: {Mobil.roda}")

Class Method & Static Method

class Suhu:
    def __init__(self, celsius):
        self.celsius = celsius

    # Instance method — akses self
    def ke_fahrenheit(self):
        return self.celsius * 9/5 + 32

    # Class method — akses class, bukan instance
    @classmethod
    def dari_fahrenheit(cls, fahrenheit):
        return cls((fahrenheit - 32) * 5/9)

    # Static method — tidak akses class/instance
    @staticmethod
    def is_mendidih(celsius):
        return celsius >= 100

    def __str__(self):
        return f"{self.celsius}°C"

s1 = Suhu(100)
s2 = Suhu.dari_fahrenheit(98.6)
print(s1.ke_fahrenheit())      # 212.0
print(s2)                      # 37.0°C
print(Suhu.is_mendidih(100))   # True

Property — Getter & Setter

class RekeningBank:
    def __init__(self, pemilik, saldo=0):
        self.pemilik  = pemilik
        self.__saldo  = saldo    # private

    @property
    def saldo(self):             # getter
        return self.__saldo

    @saldo.setter
    def saldo(self, nilai):      # setter dengan validasi
        if nilai < 0:
            raise ValueError("Saldo tidak boleh negatif!")
        self.__saldo = nilai

r = RekeningBank("Budi", 1_000_000)
print(r.saldo)          # 1000000
r.saldo = 2_000_000     # memanggil setter
# r.saldo = -500        # ValueError!

Assignment

Buat class Mahasiswa dengan atribut nama, nim, dan dict nilai per mata kuliah. Tambahkan method tambah_nilai, ipk (property), predikat (property), dan __str__.

Expected output:

[A12345] Budi Santoso — IPK: 3.43 (Sangat Memuaskan)
Matematika: 88
Algoritma: 92
Basis Data: 85
Jaringan: 78
PY main.py
Solution
Output