Menu
CoddyTech

Anggota Public, Protected, Private

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 28 dari 64.

Python memiliki tiga tingkat kontrol akses untuk anggota class: public, protected, dan private. Tingkat ini mengatur cara mengakses atribut dan method.

Berikut contoh class dengan ketiga tingkat akses:

class BankAccount:
    def __init__(self, owner, balance, account_id):
        self.owner = owner           # Publik: dapat diakses dari mana saja
        self._balance = balance      # Terlindungi: untuk penggunaan internal
        self.__account_id = account_id  # Privat: hanya dalam class
    
    def deposit(self, amount):       # method publik
        self._balance += amount
    
    def _calculate_interest(self):   # method terlindungi
        return self._balance * 0.02
    
    def __validate_transaction(self, amount):  # method privat
        return amount > 0 and amount <= self._balance

Akses member publik dari mana saja:

account = BankAccount("Alice", 1000, "12345")
print(account.owner)        # Alice
account.deposit(500)        # Berfungsi dengan baik

Akses member yang dilindungi (satu garis bawah, hanya konvensi):

print(account._balance)     # 1500 - berfungsi, tetapi tidak disarankan
result = account._calculate_interest()  # Berfungsi, tetapi tidak disarankan
print(result)               # 30.0

Coba akses anggota privat (garis bawah ganda, nama diubah):

# Ini tidak akan berhasil:
# print(account.__account_id)  # AttributeError

# Namun, ini berhasil (name mangling):
print(account._BankAccount__account_id)  # 12345

Buat subclass untuk menunjukkan akses protected dibandingkan private:

class SavingsAccount(BankAccount):
    def show_balance(self):
        return self._balance        # Protected, dapat diakses dari subclass
    
    def show_id(self):
        # return self.__account_id  # Ini tidak akan berhasil karena bersifat private
        return "Cannot access private member"
savings = SavingsAccount("Bob", 2000, "67890")
print(savings.show_balance())  # 2000
print(savings.show_id())       # Tidak dapat mengakses anggota privat

Output:

Alice
30.0
12345
2000
Cannot access private member

Poin penting: Member publik tidak memiliki prefiks dan dapat diakses dari mana saja. Member terlindungi menggunakan satu garis bawah (_) dan hanya boleh digunakan dalam hierarki class. Member privat menggunakan dua garis bawah (__) dan namanya diubah melalui name mangling untuk privasi yang lebih kuat. Kontrol akses Python didasarkan pada konvensi, bukan ditegakkan secara ketat.

challenge icon

Tantangan

Sedang

Dalam tantangan ini, kamu akan mengimplementasikan class BankAccount yang menunjukkan penggunaan tingkat akses publik, terlindungi, dan privat yang tepat di Python.

  • bankaccount.py - Berisi definisi class dengan komentar TODO yang memandu implementasimu
  1. Ikuti komentar TODO di bankaccount.py untuk mengimplementasikan fungsionalitas yang diperlukan
  2. Terapkan tingkat akses yang tepat (publik, terlindungi, privat) sesuai spesifikasi
  3. Pastikan semua method menangani kasus tepi dengan tepat (setoran negatif, dll.)

Coba sendiri

from bank_account import BankAccount

# Penangan kasus uji yang menyeluruh
test_case = input()

if test_case == "basic_test":
    # Uji fungsi dasar
    account = BankAccount("John Doe", "12345")
    print(account.account_holder)  # Atribut publik
    print(account.deposit(100))    # Method publik
    print(account.get_balance())   # Method publik

elif test_case == "transaction_count":
    # Menguji atribut terlindungi
    account = BankAccount("Jane Smith", "67890")
    account.deposit(50)
    account.deposit(100)
    account.deposit(200)
    print(account._transaction_count)  # Atribut terlindungi
    print(account.get_balance())

elif test_case == "invalid_deposit":
    # Menguji validasi dalam method deposit
    account = BankAccount("Bob Johnson", "54321")
    print(account.deposit(-50))  # Seharusnya mengembalikan None
    print(account.deposit(0))    # Seharusnya mengembalikan None
    print(account.deposit(75))   # Seharusnya mengembalikan 75
    print(account.get_balance())

elif test_case == "private_access":
    # Menguji akses ke atribut privat
    account = BankAccount("Alice Brown", "98765")
    try:
        print(account.__balance)  # Ini akan memunculkan AttributeError
    except AttributeError:
        pass
    
    try:
        print(account.__account_number)  # Ini akan memunculkan AttributeError
    except AttributeError:
        pass
    
    print("Private attributes are not directly accessible")
    account.deposit(500)
    print(account.get_balance())  # Akses melalui method publik

elif test_case == "name_mangling":
    # Menunjukkan name mangling untuk atribut privat
    account = BankAccount("Charlie Green", "13579")
    print(account._BankAccount__balance)        # Mengakses atribut privat melalui name mangling
    print(account._BankAccount__account_number)  # Mengakses atribut privat melalui name mangling
    account.deposit(300)
    print(account._BankAccount__balance)  # Seharusnya menampilkan saldo terbaru

elif test_case == "multiple_accounts":
    # Menguji beberapa rekening
    account1 = BankAccount("David White", "24680")
    account2 = BankAccount("Eva Black", "86420")
    account3 = BankAccount("Frank Red", "97531")
    
    account1.deposit(150)
    account2.deposit(250)
    account2.deposit(50)
    account3.deposit(500)
    account3.deposit(300)
    account3.deposit(200)
    
    print(f"{account1.account_holder}: {account1.get_balance()}")
    print(f"{account2.account_holder}: {account2.get_balance()}")
    print(f"{account3.account_holder}: {account3.get_balance()}")
    
    print(f"Account 1 transactions: {account1._transaction_count}")
    print(f"Account 2 transactions: {account2._transaction_count}")
    print(f"Account 3 transactions: {account3._transaction_count}")

elif test_case == "stress_test":
    # Menguji performa dengan banyak transaksi
    account = BankAccount("Stress Tester", "11111")
    for _ in range(1000):
        account.deposit(1)
    print(f"Final balance: {account.get_balance()}")
    print(f"Transaction count: {account._transaction_count}")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Python online