Menu
Coddy logo textTech

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 gizli

Gizli 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 TAMAM

Korumalı 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ştirildi

Gizli 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.

challenge icon

Görev

Orta

Bu 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"   # Private

Genel (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.")
quiz iconKendini test et

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