Modul 5 — Pemrograman Berorientasi Objek (PBO / OOP)

5.2 Enkapsulasi dan Access Modifier

Tingkat akses Public, Protected (garis bawah satu _), dan Private (garis bawah ganda __), mekanisme Name Mangling, serta perancangan method Getter (accessor) dan Setter (mutator) dengan validasi data.

Progres disimpan di browser ini saja.

A. Tingkatan Access Modifier di Python

Access modifier menentukan batasan hak akses suatu atribut atau method dari luar lingkup class-nya:

Tingkat AksesPenulisan Konvensi PythonAksesibilitas / Lingkup IzinPerilaku Runtime
Public`self.nilai` (tanpa awalan garis bawah)Dapat diakses dan diubah secara bebas langsung dari mana saja (dalam class maupun luar class).Bebas diakses langsung.
Protected`self._data` (satu awalan garis bawah `_`)Dirancang hanya untuk pemakaian internal di dalam class tersebut dan seluruh class turunannya (subclass).Secara teknis masih bisa diakses di Python, namun konvensi keras melarang pengembang memanggilnya dari luar.
Private`self.__info` (dua awalan garis bawah `__`)Hanya dapat diakses secara legal dari dalam class itu sendiri; tertutup total dari luar class.Python menerapkan *name mangling* (nama diubah menjadi `_NamaClass__info`), sehingga pemanggilan langsung `obj.__info` akan melempar `AttributeError`.
class Akun:
    def __init__(self):
        self.username = 'budi'    # Public: bebas diakses
        self._pin = 1234          # Protected: internal dan turunan
        self.__saldo = 500000     # Private: rahasia di dalam class saja

akun1 = Akun()
print(akun1.username)    # Output: budi (Berhasil, Public)
print(akun1._pin)        # Output: 1234 (Bisa, tapi melanggar konvensi Protected)
# print(akun1.__saldo)   # CRASH -> AttributeError: 'Akun' object has no attribute '__saldo'

B. Enkapsulasi Melalui Getter dan Setter

Untuk membaca atau memodifikasi atribut private secara aman dan terkontrol, pengembang menyediakan antarmuka method Getter (Accessor) dan Setter (Mutator) yang dilengkapi aturan validasi:

class Player:
    def __init__(self, name, score):
        self.name = name
        self.__score = score           # Atribut private

    # GETTER (Accessor): membaca nilai private
    def get_score(self):
        return self.__score

    # SETTER (Mutator): mengubah nilai private dengan validasi
    def set_score(self, score):
        if score >= 0:
            self.__score = score       # Penugasan ke atribut private yang benar
        else:
            print('Error: Skor tidak boleh bernilai negatif!')

# Penggunaan Aman
p = Player('Dina', 100)
print(p.get_score())   # Output: 100 (membaca via getter)
p.set_score(150)       # Berhasil mengubah skor
p.set_score(-20)       # Dicegah: Error: Skor tidak boleh bernilai negatif!

C. Ciri Implementasi Getter / Setter yang Benar pada Soal

  • Method selalu menyertakan `self` sebagai parameter pertama.
  • Getter menggunakan kata kunci `return self.__nama_atribut`.
  • Setter menerima parameter nilai baru (misal: `def set_score(self, score):`) dan menugaskannya ke variabel private yang bersesuaian (`self.__score = score`).
  • Pilihan Salah yang Sering Menipu: Mengakses variabel tanpa garis bawah (`self.score` padahal atributnya `self.__score`), lupa menyertakan `self`, atau setter yang tidak menerima argumen nilai baru.

Latihan Soal

Pilih jawaban, tekan Check, lalu baca pembahasannya.

Benar 0 / 3

Soal 1mudah

Sebuah atribut di dalam class Rekening dideklarasikan sebagai self.__saldo. Cara yang paling tepat dan sesuai dengan prinsip enkapsulasi untuk membaca nilai saldo tersebut dari luar class adalah ...

Soal 2sedang

Diberikan deklarasi atribut dalam class Python berikut: self.nama = 'Hero' self._energi = 80 self.__nyawa = 100 Berdasarkan konvensi pemrograman berorientasi objek di Python, atribut self._energi diklasifikasikan sebagai ...

Soal 3sulit

Manakah implementasi pasangan method Getter dan Setter yang paling tepat untuk mengelola atribut private self.__poin pada class Peserta?