OOP 1: Class & Object
Membuat class, atribut, method, constructor, dan memahami self.
Mengapa OOP?
Object-Oriented Programming mengelompokkan data dan perilaku yang berkaitan dalam satu kesatuan. Bayangkan sebuah rekening bank: ia punya data (nomor, saldo) dan perilaku (setor, tarik). Dengan class, keduanya digabung.
class dan object
- Class = cetak biru.
- Object (instance) = benda nyata yang dibuat dari cetak biru itu.
class Mobil:
def __init__(self, merek, warna):
self.merek = merek
self.warna = warna
def info(self):
return f"{self.warna} {self.merek}"
a = Mobil("Toyota", "merah")
b = Mobil("Honda", "biru")
print(a.info()) # merah Toyota
print(b.warna) # biru
Memahami __init__ dan self
__init__adalah constructor: dijalankan otomatis saat objek dibuat.selfadalah objek itu sendiri. Setiap method wajib menerimaselfsebagai parameter pertama; Python mengisinya otomatis saat kamu memanggila.info().self.merek = merekmenyimpan data sebagai atribut milik objek tersebut.
Atribut class vs atribut objek
class Siswa:
sekolah = "KelasIT" # atribut class: dibagi semua objek
def __init__(self, nama):
self.nama = nama # atribut objek: milik masing-masing
Method yang mengubah state
class Rekening:
def __init__(self, pemilik, saldo=0):
self.pemilik = pemilik
self.saldo = saldo
def setor(self, jumlah):
self.saldo += jumlah
def tarik(self, jumlah):
if jumlah > self.saldo:
return False
self.saldo -= jumlah
return True
Perhatikan bahwa method menyimpan hasil di self.saldo, sehingga state objek tetap terjaga antar pemanggilan.
Method khusus (dunder)
Nama berawalan dan berakhiran dua underscore punya makna khusus:
class Titik:
def __init__(self, x, y):
self.x, self.y = x, y
def __str__(self):
return f"({self.x}, {self.y})"
def __eq__(self, lain):
return self.x == lain.x and self.y == lain.y
print(Titik(1, 2)) # (1, 2)
print(Titik(1, 2) == Titik(1, 2)) # True
Enkapsulasi dengan konvensi
Python tidak memiliki private sejati. Konvensinya:
_nama: "internal, jangan diubah dari luar".__nama: name mangling (lebih sulit diakses).
@property
Mengakses method seperti atribut dan menambah validasi:
class Lingkaran:
def __init__(self, r):
self._r = r
@property
def luas(self):
return 3.14159 * self._r ** 2
Lingkaran(2).luas dipakai tanpa tanda kurung.
Kapan memakai class?
Saat ada data + perilaku yang saling terkait dan punya banyak instance. Untuk transformasi sederhana, function biasa lebih ringkas.