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