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._balanceAkses member publik dari mana saja:
account = BankAccount("Alice", 1000, "12345")
print(account.owner) # Alice
account.deposit(500) # Berfungsi dengan baikAkses 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.0Coba 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) # 12345Buat 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 privatOutput:
Alice
30.0
12345
2000
Cannot access private memberPoin 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.
Tantangan
SedangDalam 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
- Ikuti komentar TODO di
bankaccount.pyuntuk mengimplementasikan fungsionalitas yang diperlukan - Terapkan tingkat akses yang tepat (publik, terlindungi, privat) sesuai spesifikasi
- 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}")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass vs objectParameter selfmethodAtributMethod Konstruktor (__init__)Rangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan DasarFungsi super()Penimpaan MethodPewarisan BergandaUrutan Resolusi MethodRingkasan: Hierarki Karyawan5Polimorfisme
Meninjau Ulang Method OverridingDuck Typingclass dan method AbstrakDesain InterfaceRingkasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanMixinsMetode Statis dan Metode ClassDecorator ClassPengelola Konteks11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola Composite3Property class
Variabel instance vs variabel classDekorator propertyAtribut privatRangkuman: Pengelola Rekening Bank6Enkapsulasi
Anggota Public, Protected, PrivateModifier AksesPenyembunyian InformasiDecorator Property Tingkat LanjutUlasan: Sistem Catatan Siswa12Proyek: Manajemen Perpustakaan
Ikhtisar Proyekclass Buku dan PenggunaSistem PeminjamanFitur PencarianAntarmuka AdminPengujian dan IntegrasiLatihan sendiri: Compiler Python online