Menu
CoddyTech

Rangkuman: Pengelola Rekening Bank

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

challenge icon

Tantangan

Sedang

Buat class BankAccount lengkap yang menunjukkan konsep pemrograman berorientasi objek, termasuk variabel class, atribut privat, property, getter, setter, dan method. 

1. Buat class BankAccount dengan:

  • Variabel class interest_rate yang ditetapkan ke 0.02 (2%)
  • Atribut instance privat untuk __owner_name dan __balance
  • Konstruktor yang menginisialisasi atribut ini

2. Implementasikan getter dan setter property: 

  • Property hanya-baca owner_name yang mengembalikan nama pemilik akun
  • Property balance dengan:
    • Getter yang mengembalikan saldo saat ini
    • Setter yang memvalidasi setoran (menolak jumlah negatif)
    • Jika validasi gagal, cetak: "Balance cannot be negative"

3. Implementasikan method:

  • deposit(amount) yang:
    • Menambahkan ke saldo jika jumlahnya positif
    • Mencetak "Deposit amount must be positive" dan mengembalikan False jika jumlahnya tidak positif
    • Mengembalikan True jika berhasil
  • withdraw(amount) yang:
    • Mengurangi saldo jika jumlahnya positif dan dana mencukupi
    • Mencetak "Withdrawal amount must be positive" dan mengembalikan False jika jumlahnya tidak positif
    • Mencetak "Insufficient funds" dan mengembalikan False jika jumlahnya melebihi saldo
    • Mengembalikan True jika berhasil
  • apply_interest() yang:
    • Menambahkan bunga ke saldo berdasarkan suku bunga class
    • Mengembalikan jumlah bunga
  • display_info() yang mencetak detail akun dalam format ini:

    Account Owner: [owner_name]
    Balance: $[balance]
    Interest Rate: [interest_rate]%

Persyaratan Format Output

  • Semua pesan error validasi harus dicetak persis seperti yang ditentukan
  • Method display_info() harus memformat output persis seperti yang ditunjukkan di atas
  • Suku bunga harus ditampilkan sebagai persentase (kalikan dengan 100)

Coba sendiri

from bank_account import BankAccount

# Penangan kasus uji
test_case = input()

if test_case == "account_creation":
    # Uji pembuatan rekening
    account = BankAccount("Alice", 1000)
    print(f"Owner: {account.owner_name}")
    print(f"Initial balance: ${account.balance}")
    print(f"Interest rate: {BankAccount.interest_rate * 100}%")

elif test_case == "deposit_method":
    # Uji fungsi deposit
    account = BankAccount("Bob", 500)
    print(f"Initial balance: ${account.balance}")
    
    # Deposit yang valid
    result = account.deposit(300)
    print(f"Deposit result: {result}")
    print(f"New balance: ${account.balance}")
    
    # Deposit yang tidak valid
    result = account.deposit(-50)
    print(f"Negative deposit result: {result}")
    print(f"Balance after invalid deposit: ${account.balance}")

elif test_case == "withdraw_method":
    # Uji fungsi penarikan
    account = BankAccount("Charlie", 1000)
    
    # Penarikan yang valid
    result = account.withdraw(400)
    print(f"Withdrawal result: {result}")
    print(f"Balance after withdrawal: ${account.balance}")
    
    # Penarikan yang tidak valid (negatif)
    result = account.withdraw(-50)
    print(f"Negative withdrawal result: {result}")
    
    # Penarikan yang tidak valid (melebihi saldo)
    result = account.withdraw(1000)
    print(f"Excessive withdrawal result: {result}")
    print(f"Final balance: ${account.balance}")

elif test_case == "property_access":
    # Uji akses dan perlindungan property
    account = BankAccount("Dave", 800)
    
    print(f"Owner via property: {account.owner_name}")
    print(f"Balance via property: ${account.balance}")
    
    # Coba atur saldo (harus menggunakan setter)
    account.balance = 1200
    print(f"Balance after valid setter: ${account.balance}")
    
    # Coba saldo yang tidak valid
    account.balance = -500
    print(f"Balance after invalid setter: ${account.balance}")
    
    # Coba akses atribut privat secara langsung (seharusnya gagal)
    try:
        print(account.__owner_name)
    except AttributeError:
        print("Cannot access private owner_name directly")

elif test_case == "apply_interest":
    # Uji penerapan bunga
    account = BankAccount("Eve", 2000)
    
    # Periksa saldo awal
    print(f"Initial balance: ${account.balance}")
    
    # Terapkan bunga
    interest_earned = account.apply_interest()
    expected_interest = 2000 * 0.02
    
    print(f"Interest earned: ${interest_earned}")
    print(f"New balance after interest: ${account.balance}")
    print(f"Interest calculation correct: {interest_earned == expected_interest}")

elif test_case == "display_info":
    # Uji format method display_info
    account = BankAccount("Frank", 1500)
    
    # Ubah suku bunga untuk menguji variabel class
    original_rate = BankAccount.interest_rate
    BankAccount.interest_rate = 0.03
    
    print("Display info output:")
    account.display_info()
    
    # Kembalikan suku bunga semula
    BankAccount.interest_rate = original_rate

elif test_case == "original_test_case":
    # Jalankan kode uji asli dari tantangan
    account = BankAccount("Coddy", 1000)

    # Lakukan operasi
    account.deposit(500)
    account.withdraw(200)
    account.apply_interest()

    # Tampilkan informasi rekening
    account.display_info()

    # Uji validasi setter
    account.balance = 5000
    print(f"Balance after setter: ${account.balance}")

    # Uji validasi penarikan
    account.withdraw(10000)
    print(f"Final balance: ${account.balance}")

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Python online