A. Tingkatan Access Modifier di Python
Access modifier menentukan batasan hak akses suatu atribut atau method dari luar lingkup class-nya:
| Tingkat Akses | Penulisan Konvensi Python | Aksesibilitas / Lingkup Izin | Perilaku 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.