Bilgi Gizleme
Coddy'nin Python Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 30 / 64.
Bilgi gizleme, nesne bileşenlerine doğrudan erişimi kısıtlayarak tüm etkileşimlerin iyi tanımlanmış arayüzler aracılığıyla gerçekleşmesini gerektirir. Bu, dahili verileri yetkisiz erişime karşı korur.
İşte farklı bilgi gizleme seviyelerine sahip bir sınıf örneği:
class BankAccount:
def __init__(self, owner, initial_balance):
self.owner = owner # Genel - doğrudan erişilebilir
self._balance = initial_balance # Korumalı - dahili kullanım
self.__account_number = "ACC123456" # Özel - dışarıdan gizliGizli verilere kontrollü erişim sağlayan metotlar ekleyin:
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):
# Kısmi özel verileri göstermenin güvenli yolu
return f"Owner: {self.owner}, Account: ***{self.__account_number[-4:]}"Sınıfı genel arayüzü üzerinden kullanın:
account = BankAccount("Alice", 1000)Genel verilere doğrudan erişin:
print(account.owner) # Alice - genel erişim TAMAMKorumalı veriler için kontrollü yöntemler kullanın:
print(account.get_balance()) # 1000 - kontrollü erişim
account.deposit(500)
print(account.get_balance()) # 1500 - bakiye güvenli bir şekilde değiştirildiGizli verilere erişmeyi deneyin:
print(account.get_account_info()) # Sahibi: Alice, Hesap: ***3456
# print(account.__account_number) # AttributeError - gizliÖzel nitelik ad değişikliğine uğrar, ancak yine de teknik olarak erişilebilir:
# Bu çalışır ama bilgi gizlemeyi ihlal eder:
print(account._BankAccount__account_number) # ACC123456Çıktı:
Alice
1000
1500
Owner: Alice, Account: ***3456
ACC123456Temel Nokta: Bilgi gizleme, dahili verileri private veya protected yaparak korur ve ardından public metotlar aracılığıyla kontrollü erişim sağlar. Bu, hassas verilerin doğrudan değiştirilmesini önler ve erişim metotlarındaki doğrulama sayesinde veri bütünlüğünü güvence altına alır.
Görev
OrtaBu meydan okumada, çözümünüzü doğrulamak için kapsamlı testler içeren güvenli bir mesajlaşma sistemi uygulayacaksınız.
Bilgi gizleme ilkelerini izleyerek SecureMessenger sınıfını uygulamak için securemessenger.py dosyasını düzenlemeniz gerekiyor. Dosyada, uygulamanıza rehberlik edecek ayrıntılı TODO yorumları bulunuyor.
Temel gereksinimler şunlardır:
- Kimlik bilgilerinin ve mesajların uygun şekilde kapsüllenmesi
- Mesaj işlemlerine izin vermeden önce kimlik doğrulama
- Giriş denemelerini izleyerek güvenlik takibi
- TODO'larda belirtildiği şekilde kesin dönüş mesajları
Kendin dene
from securemessenger import SecureMessenger
# Test durumu işleyici
test_case = input()
if test_case == "default_test":
# Orijinal problemden standart test durumu
messenger = SecureMessenger("user1")
# Giriş yapmadan önce mesaj eklemeyi dene
print(messenger.add_message("Hello World!"))
print(messenger.add_message("Secure Message"))
# Yanlış şifre ile giriş denemesi
print(messenger.login("wrong_pass"))
# Doğru şifre ile giriş yap
print(messenger.login("secure123"))
# Başarılı girişten sonra mesaj ekle
print(messenger.add_message("Hello World!"))
print(messenger.add_message("Secure Message"))
# Mesajları getir
print(messenger.get_messages())
# Giriş denemelerini kontrol et
print(messenger.get_login_attempts())
elif test_case == "custom_password":
# Özel şifre ile test et
messenger = SecureMessenger("admin", "admin123")
print(messenger.login("wrong_password"))
print(messenger.login("admin123"))
print(messenger.get_login_attempts())
elif test_case == "multiple_login_attempts":
# Birden fazla giriş denemesini test et
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":
# Test message management
messenger = SecureMessenger("user3")
print(messenger.login("secure123"))
# Birden fazla mesaj ekle
messages = ["Message 1", "Message 2", "Message 3", "Message 4", "Message 5"]
for msg in messages:
print(messenger.add_message(msg))
# Tüm mesajları doğrula
print(messenger.get_messages())
elif test_case == "empty_messages":
# Boş mesajlar durumunu test et
messenger = SecureMessenger("user4")
print(messenger.login("secure123"))
print(messenger.get_messages())
elif test_case == "access_without_login":
# Giriş yapmadan erişimi test et
messenger = SecureMessenger("user5")
print(messenger.add_message("Unauthorized message"))
print(messenger.get_messages())
elif test_case == "attribute_privacy":
# Öznitelik gizliliğini test et
messenger = SecureMessenger("user6")
# Genel öznitelik
print(f"Public username: {messenger.username}")
# Özel öznitelikler - bunlar AttributeError hatası vermelidir
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":
# Bu test, sınıfın bir logout metodu ile genişletilmesini gerektirir
# Test amaçlı, logout işlevselliğine sahip bir alt sınıf oluşturacağız
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":
# Çok sayıda mesaj ile stres testi
messenger = SecureMessenger("user8")
print(messenger.login("secure123"))
# 100 mesaj ekle
for i in range(1, 101):
messenger.add_message(f"Message {i}")
# Mesaj sayısını doğrula
messages = messenger.get_messages()
newline_char = '\n' # Yeni satır karakterini bir değişkende sakla
message_count = len(messages.split(newline_char))
print(f"Added 100 messages. Retrieved {message_count} messages.")Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıKendi başına pratik yap: Online Python derleyicisi