Penyembunyian Informasi
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 30 dari 64.
Penyembunyian informasi membatasi akses langsung ke komponen object, sehingga semua interaksi harus dilakukan melalui antarmuka yang terdefinisi dengan baik. Hal ini melindungi data internal dari akses tanpa izin.
Berikut contoh class dengan berbagai tingkat penyembunyian informasi:
class BankAccount:
def __init__(self, owner, initial_balance):
self.owner = owner # Publik: bisa diakses langsung
self._balance = initial_balance # Terlindungi: untuk penggunaan internal
self.__account_number = "ACC123456" # Privat: tersembunyi dari luarTambahkan method yang menyediakan akses terkendali ke data tersembunyi:
class BankAccount:
def __init__(self, owner, initial_balance):
self.owner = owner
self._balance = initial_balance
self.__account_number = "ACC123456"
def deposit(self, amount):
if amount > 0:
self._balance += amount
return True
return False
def withdraw(self, amount):
if amount > 0 and amount <= self._balance:
self._balance -= amount
return True
return False
def get_balance(self):
return self._balance
def get_account_info(self):
# Cara aman untuk menampilkan sebagian data privat
return f"Owner: {self.owner}, Account: ***{self.__account_number[-4:]}"Gunakan class melalui antarmuka publiknya:
account = BankAccount("Alice", 1000)Akses data publik secara langsung:
print(account.owner) # Alice, akses publik diperbolehkanGunakan method yang terkontrol untuk data yang dilindungi:
print(account.get_balance()) # 1000, akses terkendali
account.deposit(500)
print(account.get_balance()) # 1500, saldo berubah dengan amanCoba akses data tersembunyi:
print(account.get_account_info()) # Pemilik: Alice, Rekening: ***3456
# print(account.__account_number) # AttributeError: tersembunyiAtribut privat mengalami name mangling, tetapi secara teknis masih dapat diakses:
# Ini berfungsi, tetapi melanggar prinsip penyembunyian informasi:
print(account._BankAccount__account_number) # ACC123456Output:
Alice
1000
1500
Owner: Alice, Account: ***3456
ACC123456Poin Penting: Penyembunyian informasi melindungi data internal dengan menjadikannya private atau protected, lalu menyediakan akses yang terkendali melalui method public. Hal ini mencegah manipulasi langsung terhadap data sensitif dan memastikan integritas data melalui validasi dalam method akses.
Tantangan
SedangDalam tantangan ini, kamu akan menerapkan sistem pesan aman dengan pengujian menyeluruh untuk memvalidasi solusimu.
Kamu perlu mengedit securemessenger.py untuk menerapkan class SecureMessenger sesuai prinsip penyembunyian informasi. File ini berisi komentar TODO terperinci sebagai panduan penerapanmu.
Persyaratan utama meliputi:
- Enkapsulasi kredensial dan pesan yang tepat
- Autentikasi sebelum mengizinkan operasi pesan
- Pemantauan keamanan melalui pelacakan percobaan login
- Pesan pengembalian yang tepat sesuai spesifikasi di TODO
Coba sendiri
from securemessenger import SecureMessenger
# Penangan kasus uji
test_case = input()
if test_case == "default_test":
# Kasus uji standar dari soal asli
messenger = SecureMessenger("user1")
# Coba tambahkan pesan sebelum login
print(messenger.add_message("Hello World!"))
print(messenger.add_message("Secure Message"))
# Coba login dengan kata sandi yang salah
print(messenger.login("wrong_pass"))
# Login dengan kata sandi yang benar
print(messenger.login("secure123"))
# Tambahkan pesan setelah berhasil login
print(messenger.add_message("Hello World!"))
print(messenger.add_message("Secure Message"))
# Ambil pesan
print(messenger.get_messages())
# Periksa percobaan login
print(messenger.get_login_attempts())
elif test_case == "custom_password":
# Uji dengan kata sandi khusus
messenger = SecureMessenger("admin", "admin123")
print(messenger.login("wrong_password"))
print(messenger.login("admin123"))
print(messenger.get_login_attempts())
elif test_case == "multiple_login_attempts":
# Uji beberapa percobaan login
messenger = SecureMessenger("user2")
print(messenger.login("attempt1"))
print(messenger.login("attempt2"))
print(messenger.login("attempt3"))
print(messenger.login("secure123"))
print(messenger.get_login_attempts())
elif test_case == "message_management":
# Pengelolaan Test message
messenger = SecureMessenger("user3")
print(messenger.login("secure123"))
# Tambahkan beberapa pesan
messages = ["Message 1", "Message 2", "Message 3", "Message 4", "Message 5"]
for msg in messages:
print(messenger.add_message(msg))
# Periksa semua pesan
print(messenger.get_messages())
elif test_case == "empty_messages":
# Uji kasus pesan kosong
messenger = SecureMessenger("user4")
print(messenger.login("secure123"))
print(messenger.get_messages())
elif test_case == "access_without_login":
# Uji akses tanpa login
messenger = SecureMessenger("user5")
print(messenger.add_message("Unauthorized message"))
print(messenger.get_messages())
elif test_case == "attribute_privacy":
# Uji privasi atribut
messenger = SecureMessenger("user6")
# Atribut publik
print(f"Public username: {messenger.username}")
# Atribut privat: ini seharusnya memunculkan AttributeError
try:
print(messenger.__password)
except AttributeError as e:
print("Password is private: AttributeError")
try:
print(messenger.__messages)
except AttributeError as e:
print("Messages are private: AttributeError")
try:
print(messenger.__login_attempts)
except AttributeError as e:
print("Login attempts are private: AttributeError")
try:
print(messenger.__is_logged_in)
except AttributeError as e:
print("Login status is private: AttributeError")
elif test_case == "login_logout_sequence":
# Pengujian ini mengharuskan kamu memperluas class dengan method logout
# Untuk pengujian, kita akan membuat subclass dengan fungsi logout
class ExtendedMessenger(SecureMessenger):
def logout(self):
self._SecureMessenger__is_logged_in = False
return "Logged out successfully"
messenger = ExtendedMessenger("user7")
print(messenger.login("secure123"))
print(messenger.add_message("Test message"))
print(messenger.get_messages())
print(messenger.logout())
print(messenger.get_messages())
elif test_case == "stress_test":
# Uji beban dengan banyak pesan
messenger = SecureMessenger("user8")
print(messenger.login("secure123"))
# Tambahkan 100 pesan
for i in range(1, 101):
messenger.add_message(f"Message {i}")
# Periksa jumlah pesan
messages = messenger.get_messages()
newline_char = '\n' # Simpan karakter baris baru dalam variabel
message_count = len(messages.split(newline_char))
print(f"Added 100 messages. Retrieved {message_count} messages.")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