Python OOP

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):

mahasiswa.py
class Mahasiswa:
    pass  # Class kosong untuk sementara

Naming 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:

mahasiswa.py
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 Sumatera

Constructor: Method __init__

Constructor adalah method khusus yang dipanggil otomatis ketika objek dibuat. Di Python, constructor didefinisikan dengan method __init__:

mahasiswa.py
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 default

Parameter 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:

mahasiswa.py
# 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: TI67890

Instance 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:

mahasiswa.py
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:

mahasiswa_complete.py
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)  # Informatika
class 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:

special_methods.py
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
    pass

2. 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
        pass

3. 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

  1. Buat class Buku dengan atribut judul, penulis, tahun_terbit, dan harga
  2. Tambahkan method untuk menampilkan informasi buku
  3. Tambahkan method untuk memberikan diskon pada harga
  4. Buat beberapa object dari class Buku dan test method-nya
  5. 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.