Class dan Object
Membuat class, object, atribut, dan method dalam Python
Apa itu Class?
Class adalah blueprint atau template untuk membuat objek. Class mendefinisikan atribut (data) dan metode (fungsi) yang akan dimiliki oleh objek.
Analogi
Class seperti blueprint rumah. Blueprint mendefinisikan struktur rumah: berapa kamar, di mana pintu, dll. Dari satu blueprint, Kalian bisa membangun banyak rumah (objek) dengan struktur yang sama tapi mungkin warna atau furnitur berbeda.
Apa itu Object?
Object adalah instance dari sebuah class. Ketika Kalian membuat objek dari class, Kalian membuat sebuah entitas konkret berdasarkan blueprint yang didefinisikan oleh class.
Membuat Class Sederhana
Sintaks Dasar Class
Class didefinisikan menggunakan keyword class diikuti nama class (biasanya menggunakan PascalCase):
class Mahasiswa:
pass # Class kosong untuk sementaraNaming Convention
Nama class menggunakan PascalCase (huruf pertama setiap kata kapital tanpa underscore). Contoh: Mahasiswa, KaryawanTetap, UserProfile.
Menambahkan Atribut Class
Atribut class adalah variabel yang dimiliki bersama oleh semua instance dari class:
class Mahasiswa:
# Atribut class (shared by all instances)
jurusan = "Teknik Informatika"
universitas = "Institut Teknologi Sumatera"Atribut class dapat diakses tanpa membuat instance:
print(Mahasiswa.jurusan) # Output: Teknik Informatika
print(Mahasiswa.universitas) # Output: Institut Teknologi SumateraConstructor: Method __init__
Constructor adalah method khusus yang dipanggil otomatis ketika objek dibuat. Di Python, constructor didefinisikan dengan method __init__:
class Mahasiswa:
# Atribut class
jurusan = "Teknik Informatika"
# Constructor
def __init__(self, nama, nim):
# Atribut instance
self.nama = nama
self.nim = nim
self.aktif = True # Nilai defaultParameter self
self adalah referensi ke instance objek yang sedang dibuat. Ini HARUS menjadi parameter pertama di setiap instance method. Python akan otomatis mengisi parameter ini, jadi Kalian tidak perlu menyediakannya saat memanggil method.
Membuat Object (Instance)
Untuk membuat object dari class, panggil class seperti memanggil function:
# Membuat object
mhs1 = Mahasiswa("Budi Santoso", "TI12345")
mhs2 = Mahasiswa("Ani Wijaya", "TI67890")
# Mengakses atribut
print(mhs1.nama) # Output: Budi Santoso
print(mhs1.nim) # Output: TI12345
print(mhs1.jurusan) # Output: Teknik Informatika
print(mhs2.nama) # Output: Ani Wijaya
print(mhs2.nim) # Output: TI67890Instance vs Class Attribute
Instance attribute (self.nama, self.nim): Unik untuk setiap object.
Class attribute (jurusan): Dibagikan oleh semua object dari class yang sama.
Menambahkan Method
Method adalah fungsi yang didefinisikan di dalam class dan dapat dipanggil oleh objek:
class Mahasiswa:
jurusan = "Teknik Informatika"
def __init__(self, nama, nim):
self.nama = nama
self.nim = nim
self.ipk = 0.0
# Method untuk menampilkan informasi
def display_info(self):
print(f"Nama: {self.nama}")
print(f"NIM: {self.nim}")
print(f"Jurusan: {self.jurusan}")
print(f"IPK: {self.ipk}")
# Method untuk mengubah IPK
def set_ipk(self, ipk_baru):
if 0.0 <= ipk_baru <= 4.0:
self.ipk = ipk_baru
print(f"IPK berhasil diubah menjadi {ipk_baru}")
else:
print("IPK harus antara 0.0 dan 4.0")
# Method untuk cek status kelulusan
def is_lulus(self):
return self.ipk >= 2.75
# Menggunakan method
mhs1 = Mahasiswa("Budi Santoso", "TI12345")
mhs1.display_info()
mhs1.set_ipk(3.5)
print(f"Status kelulusan: {'Lulus' if mhs1.is_lulus() else 'Tidak Lulus'}")Contoh Lengkap
Mari kita lihat contoh lengkap implementasi class dan object:
class Mahasiswa:
# Atribut Class (shared by all instances)
jurusan = "Teknik Informatika"
# Constructor/initializer
def __init__(self, nama, nim):
# Atribut Instance (unique for each instance)
self.nama = nama
self.nim = nim
self.ipk = 0.0
self.mata_kuliah = []
# Method untuk menampilkan info
def display_info(self):
print(f"\n{'='*40}")
print(f"Nama: {self.nama}")
print(f"NIM: {self.nim}")
print(f"Jurusan: {self.jurusan}")
print(f"IPK: {self.ipk}")
if self.mata_kuliah:
print(f"Mata Kuliah: {', '.join(self.mata_kuliah)}")
print(f"{'='*40}")
# Method untuk mengubah nama
def update_nama(self, nama_baru):
self.nama = nama_baru
print(f"Nama berhasil diubah menjadi {nama_baru}")
# Method untuk set IPK dengan validasi
def set_ipk(self, ipk_baru):
if 0.0 <= ipk_baru <= 4.0:
self.ipk = ipk_baru
print(f"IPK berhasil diset: {ipk_baru}")
else:
print("Error: IPK harus antara 0.0 dan 4.0")
# Method untuk menambah mata kuliah
def tambah_matkul(self, nama_matkul):
self.mata_kuliah.append(nama_matkul)
print(f"Mata kuliah '{nama_matkul}' ditambahkan")
# Method untuk cek status
def get_status(self):
if self.ipk >= 3.5:
return "Cum Laude"
elif self.ipk >= 2.75:
return "Lulus"
else:
return "Belum Lulus"
# Membuat beberapa object
print("Membuat mahasiswa...")
mhs1 = Mahasiswa("Budi Santoso", "TI12345")
mhs2 = Mahasiswa("Ani Wijaya", "TI67890")
# Menggunakan method
mhs1.set_ipk(3.8)
mhs1.tambah_matkul("Pemrograman Web")
mhs1.tambah_matkul("Basis Data")
mhs1.display_info()
print(f"Status: {mhs1.get_status()}")
mhs2.set_ipk(3.2)
mhs2.tambah_matkul("Algoritma")
mhs2.display_info()
print(f"Status: {mhs2.get_status()}")
# Mengubah class attribute (berlaku untuk semua instance)
print("\nMengubah jurusan...")
Mahasiswa.jurusan = "Informatika"
mhs1.display_info()
mhs2.display_info()Perbedaan Class Attribute vs Instance Attribute
class Mahasiswa:
# Class attribute - shared by all instances
jurusan = "Teknik Informatika"
total_mahasiswa = 0
def __init__(self, nama):
self.nama = nama
Mahasiswa.total_mahasiswa += 1
# Semua instance berbagi class attribute yang sama
mhs1 = Mahasiswa("Budi")
mhs2 = Mahasiswa("Ani")
print(mhs1.jurusan) # Teknik Informatika
print(mhs2.jurusan) # Teknik Informatika
print(Mahasiswa.total_mahasiswa) # 2
# Mengubah class attribute mempengaruhi semua instance
Mahasiswa.jurusan = "Informatika"
print(mhs1.jurusan) # Informatika
print(mhs2.jurusan) # Informatikaclass Mahasiswa:
def __init__(self, nama, nim):
# Instance attributes - unique to each instance
self.nama = nama
self.nim = nim
# Setiap instance memiliki nilai yang berbeda
mhs1 = Mahasiswa("Budi", "TI123")
mhs2 = Mahasiswa("Ani", "TI456")
print(mhs1.nama) # Budi
print(mhs2.nama) # Ani
# Mengubah instance attribute hanya mempengaruhi instance tersebut
mhs1.nama = "Budi Santoso"
print(mhs1.nama) # Budi Santoso
print(mhs2.nama) # Ani (tidak berubah)Special Methods (Dunder Methods)
Python memiliki special methods yang diawali dan diakhiri dengan double underscore (__). Method ini memiliki perilaku khusus:
class Mahasiswa:
def __init__(self, nama, nim):
self.nama = nama
self.nim = nim
# Method untuk representasi string (debugging)
def __repr__(self):
return f"Mahasiswa(nama='{self.nama}', nim='{self.nim}')"
# Method untuk string yang user-friendly
def __str__(self):
return f"{self.nama} ({self.nim})"
# Method untuk perbandingan
def __eq__(self, other):
if isinstance(other, Mahasiswa):
return self.nim == other.nim
return False
# Penggunaan
mhs1 = Mahasiswa("Budi", "TI123")
mhs2 = Mahasiswa("Ani", "TI456")
mhs3 = Mahasiswa("Budi Copy", "TI123")
print(str(mhs1)) # Budi (TI123)
print(repr(mhs1)) # Mahasiswa(nama='Budi', nim='TI123')
print(mhs1 == mhs2) # False
print(mhs1 == mhs3) # True (NIM sama)Praktik Terbaik
1. Naming Conventions
# Good - PascalCase for class names
class UserProfile:
pass
class OrderManager:
pass
# Avoid - lowercase or snake_case for class names
class user_profile: # Avoid
pass2. Single Responsibility Principle
Setiap class harus memiliki satu tanggung jawab utama:
# Good - Each class has single responsibility
class Mahasiswa:
def __init__(self, nama, nim):
self.nama = nama
self.nim = nim
class NilaiManager:
def hitung_ipk(self, nilai_list):
return sum(nilai_list) / len(nilai_list)
# Avoid - Class doing too many things
class Mahasiswa:
def __init__(self, nama, nim):
self.nama = nama
self.nim = nim
def hitung_ipk(self):
pass
def cetak_transkrip(self):
pass
def kelola_pembayaran(self): # Not mahasiswa's responsibility
pass3. Documentation
Gunakan docstring untuk mendokumentasikan class dan method:
class Mahasiswa:
"""
Class untuk merepresentasikan data mahasiswa.
Attributes:
nama (str): Nama lengkap mahasiswa
nim (str): Nomor Induk Mahasiswa
ipk (float): Indeks Prestasi Kumulatif
"""
def __init__(self, nama, nim):
"""
Inisialisasi objek Mahasiswa.
Args:
nama (str): Nama lengkap mahasiswa
nim (str): Nomor Induk Mahasiswa
"""
self.nama = nama
self.nim = nim
self.ipk = 0.0
def set_ipk(self, ipk_baru):
"""
Set IPK mahasiswa dengan validasi.
Args:
ipk_baru (float): Nilai IPK baru (0.0 - 4.0)
Raises:
ValueError: Jika IPK di luar range 0.0 - 4.0
"""
if 0.0 <= ipk_baru <= 4.0:
self.ipk = ipk_baru
else:
raise ValueError("IPK harus antara 0.0 dan 4.0")Latihan
- Buat class
Bukudengan atribut judul, penulis, tahun_terbit, dan harga - Tambahkan method untuk menampilkan informasi buku
- Tambahkan method untuk memberikan diskon pada harga
- Buat beberapa object dari class
Bukudan test method-nya - Implementasikan
__str__dan__repr__method
Langkah Selanjutnya
Setelah memahami class dan object dasar, kita akan mempelajari Inheritance untuk membuat class yang mewarisi atribut dan method dari class lain.
