Menu
Coddy logo textTech

Erişim Belirleyiciler

Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 29 / 64.

Erişim belirleyicileri, sınıf özniteliklerinin ve yöntemlerinin görünürlüğünü kontrol eder. Python, erişim kontrolü için anahtar kelimeler yerine adlandırma kurallarını kullanır.

İşte genel erişime (ön ek yok) bir örnek:

class Person:
    def __init__(self):
        self.name = "Coddy"      # Public attribute
        
    def greet(self):             # Public method
        return f"Hello, I'm {self.name}"

Public üyelere her yerden erişin:

person = Person()
print(person.name)           # Coddy
print(person.greet())        # Merhaba, ben Coddy

İşte korumalı erişime (tek alt çizgi) bir örnek:

class Employee:
    def __init__(self):
        self._salary = 50000     # Korumalı öznitelik
    
    def _calculate_bonus(self):  # Korumalı metot
        return self._salary * 0.1

    def show_bonus(self):
        return self._calculate_bonus()  # Sınıf içinde kullanımı uygundur

Korumalı üyelere erişim (çalışır ancak önerilmez):

employee = Employee()
print(employee._salary)      # 50000 - çalışır ancak tavsiye edilmez
print(employee.show_bonus()) # 5000.0 - doğru yöntem

İşte özel erişime (çift alt çizgi) bir örnek:

class User:
    def __init__(self):
        self.__password = "secure123"   # Özel öznitelik
        
    def __encrypt(self, data):          # Özel metot
        return f"Encrypted: {data}"
        
    def verify(self, input_password):
        # Özel üyelere sınıf içinden erişilebilir
        return input_password == self.__password

Özel (private) üyeleri doğru şekilde kullanın:

user = User()
print(user.verify("secure123"))  # True - genel (public) metot kullanılıyor
# print(user.__password)         # AttributeError - doğrudan erişilemez

Çıktı:

Coddy
Hello, I'm Coddy
50000
5000.0
True

Önemli Nokta: Python erişim belirleyicileri (access modifiers) isimlendirme kurallarıdır: önek yok = public (her yerden erişilebilir), tek alt çizgi = protected (dahili kullanım), çift alt çizgi = private (sadece sınıf içi). Bunlar net sınırlar oluşturmaya yardımcı olur ve sınıfın dahili bileşenlerinin yanlışlıkla hatalı kullanımını önlemede yardımcı olur.

challenge icon

Görev

Orta

Bu meydan okumada, kapsamlı testlerin avantajlarını deneyimlerken Python'ın erişim belirleyicilerini (public, protected ve private) gösteren bir FileManager sınıfı uygulayacaksınız.

FileManager sınıfını uygulamak için TODO yorumlarını takip ederek filemanager.py dosyasını düzenleyin. Dosya, şunları uygulamak için ayrıntılı talimatlar içerir:

  • Dosya işlemleri için public metotlar
  • Protected metotlar (tek alt çizgi öneki ile)
  • Private metotlar (çift alt çizgi öneki ile)
  • Kapsüllemeyi (encapsulation) gösteren metot etkileşimleri

Kopya kağıdı

Python, erişim kontrolü için isimlendirme kurallarını kullanır:

Genel erişim (Public access) (ön ek yok) - her yerden erişilebilir:

class Person:
    def __init__(self):
        self.name = "Coddy"      # Genel öznitelik
        
    def greet(self):             # Genel metot
        return f"Hello, I'm {self.name}"

person = Person()
print(person.name)           # Coddy
print(person.greet())        # Hello, I'm Coddy

Korumalı erişim (Protected access) (tek alt çizgi) - dahili kullanım, dışarıdan kullanımı önerilmez:

class Employee:
    def __init__(self):
        self._salary = 50000     # Korumalı öznitelik
    
    def _calculate_bonus(self):  # Korumalı metot
        return self._salary * 0.1

employee = Employee()
print(employee._salary)      # Çalışır ancak önerilmez

Özel erişim (Private access) (çift alt çizgi) - sadece sınıf içi:

class User:
    def __init__(self):
        self.__password = "secure123"   # Özel öznitelik
        
    def __encrypt(self, data):          # Özel metot
        return f"Encrypted: {data}"
        
    def verify(self, input_password):
        return input_password == self.__password

user = User()
print(user.verify("secure123"))  # True - genel metot kullanılıyor
# print(user.__password)         # AttributeError - doğrudan erişilemez

Kendin dene

from file_manager import FileManager

# Kapsamlı test durumu işleyicisi
test_case = input()

if test_case == "basic_test":
    # Bir FileManager örneği oluştur
    manager = FileManager()
    # read_file metodunu çağır
    print(manager.read_file("example.txt"))
    # get_file_content metodunu çağır
    print(manager.get_file_content("example.txt"))

elif test_case == "protected_access":
    # Bir FileManager örneği oluştur
    manager = FileManager()
    # Korumalı (protected) metodu çağırmayı dene
    # Korumalı metodlara erişilebilir ancak dahili kullanım için tasarlanmıştır
    print(manager._check_permissions("example.txt"))
    print("Note: Protected methods are accessible but intended for internal use only")

elif test_case == "private_access":
    # Bir FileManager örneği oluştur
    manager = FileManager()
    try:
        # Özel (private) metodu doğrudan çağırmayı dene
        print(manager.__decrypt_content("some content"))
    except AttributeError as e:
        print(f"Error: {e}")
        print("Private methods are name-mangled and cannot be accessed directly")
    
    # İsim karıştırma (name-mangled) formunu kullanarak eriş
    print(manager._FileManager__decrypt_content("some content"))
    print("Note: Accessed private method using name-mangled form")

elif test_case == "method_chaining":
    # Bir FileManager örneği oluştur
    manager = FileManager()
    # get_file_content'in dahili olarak hem korumalı hem de özel metodları nasıl çağırdığını göster
    print("Calling get_file_content which internally uses protected and private methods:")
    print(manager.get_file_content("example.txt"))

elif test_case == "multiple_files":
    # Bir FileManager örneği oluştur
    manager = FileManager()
    # Birden fazla dosyayı işle
    files = ["document.txt", "image.jpg", "data.csv"]
    
    for file in files:
        print(f"\
Processing {file}:")
        print(manager.read_file(file))
        print(manager.get_file_content(file))

elif test_case == "name_mangling":
    # Bir FileManager örneği oluştur
    manager = FileManager()
    # İsim karıştırmayı (name mangling) göster
    print("Python's name mangling for private methods:")
    print("Attempting direct access would fail with AttributeError")
    print("Using mangled name:")
    print(manager._FileManager__decrypt_content("private data"))
    print("\
Name mangling is Python's mechanism to prevent accidental access")
    print("It renames __method to _ClassName__method internally")
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