Bilgi Gizleme
Coddy'nin Python Journey'sinin Object Oriented Programming 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 (private) öznitelik ad-karıştırma (name-mangling) işlemine tabi tutulur ancak teknik olarak hala erişilebilirdir:
# Bu çalışır ancak bilgi gizleme (information hiding) ilkesini ihlal eder:
print(account._BankAccount__account_number) # ACC123456Çıktı:
Alice
1000
1500
Owner: Alice, Account: ***3456
ACC123456Önemli Nokta: Bilgi gizleme (information hiding), dahili verileri private veya protected yaparak ve ardından public metotlar aracılığıyla kontrollü erişim sağlayarak korur. Bu, hassas verilerin doğrudan manipülasyonunu önler ve erişim metotlarındaki doğrulama yoluyla veri bütünlüğünü sağlar.
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 takip ederek SecureMessenger sınıfını uygulamak için securemessenger.py dosyasını düzenlemeniz gerekiyor. Dosya, uygulamanıza rehberlik edecek detaylı TODO yorumları içermektedir.
Temel gereksinimler şunlardır:
- Kimlik bilgilerinin ve mesajların uygun şekilde kapsüllenmesi
- Mesaj işlemlerine izin verilmeden önce kimlik doğrulaması yapılması
- Giriş denemesi takibi yoluyla güvenlik izlemesi
- TODO'larda belirtilen kesin dönüş mesajları
Kopya kağıdı
Bilgi gizleme, erişim belirleyicileri aracılığıyla nesne bileşenlerine doğrudan erişimi kısıtlar:
public- doğrudan erişilebilir (alt çizgi yok)_protected- dahili kullanım (tek alt çizgi)__private- dışarıdan gizli (çift alt çizgi)
class BankAccount:
def __init__(self, owner, initial_balance):
self.owner = owner # Public
self._balance = initial_balance # Protected
self.__account_number = "ACC123456" # PrivateGenel (public) metotlar aracılığıyla kontrollü erişim sağlayın:
def get_balance(self):
return self._balance
def deposit(self, amount):
if amount > 0:
self._balance += amount
return True
return FalseÖzel (private) öznitelikler isim tahrifatına (name-mangling) uğrar ancak yine de erişilebilirdir:
# Bilgi gizlemeyi ihlal eder ancak çalışır:
print(account._BankAccount__account_number)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":
# Mesaj yönetimini test et
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.
Object Oriented Programming 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ı