Menu
Coddy logo textTech

Public, Protected, Private Üyeler

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

Python'da sınıf üyeleri için üç erişim kontrolü seviyesi vardır: public, protected ve private. Bunlar, özniteliklere ve yöntemlere nasıl erişilebileceğini kontrol eder.

İşte her üç erişim seviyesine sahip bir sınıf örneği:

class BankAccount:
    def __init__(self, owner, balance, account_id):
        self.owner = owner           # Genel (Public) - her yerden erişilebilir
        self._balance = balance      # Korumalı (Protected) - dahili kullanım
        self.__account_id = account_id  # Özel (Private) - sadece sınıf içi
    
    def deposit(self, amount):       # Genel (Public) metot
        self._balance += amount
    
    def _calculate_interest(self):   # Korumalı (Protected) metot
        return self._balance * 0.02
    
    def __validate_transaction(self, amount):  # Özel (Private) metot
        return amount > 0 and amount <= self._balance

Public (genel) üyelere her yerden erişin:

account = BankAccount("Alice", 1000, "12345")
print(account.owner)        # Alice
account.deposit(500)        # Sorunsuz çalışır

Korumalı üyelere erişim (tek alt çizgi - yalnızca kural gereği):

print(account._balance)     # 1500 - çalışır ancak önerilmez
result = account._calculate_interest()  # Çalışır ancak önerilmez
print(result)               # 30.0

Özel (private) üyelere erişmeyi deneyin (çift alt çizgi - ad karıştırma):

# Bu çalışmayacaktır:
# print(account.__account_id)  # AttributeError

# Ancak bu çalışır (ad karıştırma):
print(account._BankAccount__account_id)  # 12345

Korumalı (protected) ve özel (private) erişimi göstermek için bir alt sınıf oluşturun:

class SavingsAccount(BankAccount):
    def show_balance(self):
        return self._balance        # Korumalı (Protected) - alt sınıfta erişilebilir
    
    def show_id(self):
        # return self.__account_id  # Bu çalışmaz - özel (private)
        return "Cannot access private member"
savings = SavingsAccount("Bob", 2000, "67890")
print(savings.show_balance())  # 2000
print(savings.show_id())       # Özel üyeye erişilemiyor

Çıktı:

Alice
30.0
12345
2000
Cannot access private member

Önemli Nokta: Genel (Public) üyelerin herhangi bir ön eki yoktur ve her yerden erişilebilirler. Korumalı (Protected) üyeler tek alt çizgi (_) kullanır ve yalnızca sınıf hiyerarşisi içinde kullanılmalıdır. Özel (Private) üyeler çift alt çizgi (__) kullanır ve daha güçlü bir gizlilik için ad değişikliğine (name-mangling) uğrarlar. Python'un erişim kontrolü kural tabanlıdır, kesin olarak zorunlu tutulmaz.

challenge icon

Görev

Orta

Bu meydan okumada, Python'da public, protected ve private erişim seviyelerinin doğru kullanımını gösteren bir BankAccount sınıfı uygulayacaksınız.

  • bankaccount.py - Uygulamanıza rehberlik eden TODO yorumlarını içeren sınıf tanımını barındırır
  1. Gerekli işlevselliği uygulamak için bankaccount.py dosyasındaki TODO yorumlarını takip edin
  2. Belirtildiği şekilde uygun erişim seviyelerini (public, protected, private) uygulayın
  3. Tüm metotların uç durumları (negatif para yatırma işlemleri vb.) uygun şekilde ele aldığından emin olun

Kopya kağıdı

Python'da sınıf üyeleri için üç erişim kontrol seviyesi vardır:

  • Public: Önek yok, her yerden erişilebilir
  • Protected: Tek alt çizgi (_), sınıf hiyerarşisi içinde dahili kullanım
  • Private: Çift alt çizgi (__), sadece sınıf içi erişim için ad-karıştırma (name-mangling) uygulanır
class BankAccount:
    def __init__(self, owner, balance, account_id):
        self.owner = owner           # Public (Genel)
        self._balance = balance      # Protected (Korumalı)
        self.__account_id = account_id  # Private (Özel)
    
    def deposit(self, amount):       # Public metot
        self._balance += amount
    
    def _calculate_interest(self):   # Protected metot
        return self._balance * 0.02
    
    def __validate_transaction(self, amount):  # Private metot
        return amount > 0 and amount <= self._balance

Üyelere erişim:

account = BankAccount("Alice", 1000, "12345")

# Public erişim
print(account.owner)        # Sorunsuz çalışır

# Protected erişim (çalışır ancak önerilmez)
print(account._balance)     # 1500

# Private erişim (ad-karıştırma uygulanmış)
print(account._BankAccount__account_id)  # 12345

Alt sınıflarda:

class SavingsAccount(BankAccount):
    def show_balance(self):
        return self._balance        # Protected - erişilebilir
    
    def show_id(self):
        # return self.__account_id  # Private - erişilemez
        return "Cannot access private member"

Kendin dene

from bank_account import BankAccount

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

if test_case == "basic_test":
    # Temel işlevsellik testi
    account = BankAccount("John Doe", "12345")
    print(account.account_holder)  # Genel öznitelik
    print(account.deposit(100))    # Genel metot
    print(account.get_balance())   # Genel metot

elif test_case == "transaction_count":
    # Korumalı öznitelik testi
    account = BankAccount("Jane Smith", "67890")
    account.deposit(50)
    account.deposit(100)
    account.deposit(200)
    print(account._transaction_count)  # Korumalı öznitelik
    print(account.get_balance())

elif test_case == "invalid_deposit":
    # Para yatırma metodunda doğrulama testi
    account = BankAccount("Bob Johnson", "54321")
    print(account.deposit(-50))  # None döndürmeli
    print(account.deposit(0))    # None döndürmeli
    print(account.deposit(75))   # 75 döndürmeli
    print(account.get_balance())

elif test_case == "private_access":
    # Özel öznitelik erişim testi
    account = BankAccount("Alice Brown", "98765")
    try:
        print(account.__balance)  # Bu bir AttributeError hatası fırlatacaktır
    except AttributeError:
        pass
    
    try:
        print(account.__account_number)  # Bu bir AttributeError hatası fırlatacaktır
    except AttributeError:
        pass
    
    print("Private attributes are not directly accessible")
    account.deposit(500)
    print(account.get_balance())  # Genel metot aracılığıyla erişim

elif test_case == "name_mangling":
    # Özel öznitelikler için isim gizleme (name mangling) gösterimi
    account = BankAccount("Charlie Green", "13579")
    print(account._BankAccount__balance)        # İsim gizleme yoluyla özel özniteliğe erişim
    print(account._BankAccount__account_number)  # İsim gizleme yoluyla özel özniteliğe erişim
    account.deposit(300)
    print(account._BankAccount__balance)  # Güncellenmiş bakiyeyi göstermeli

elif test_case == "multiple_accounts":
    # Birden fazla hesap testi
    account1 = BankAccount("David White", "24680")
    account2 = BankAccount("Eva Black", "86420")
    account3 = BankAccount("Frank Red", "97531")
    
    account1.deposit(150)
    account2.deposit(250)
    account2.deposit(50)
    account3.deposit(500)
    account3.deposit(300)
    account3.deposit(200)
    
    print(f"{account1.account_holder}: {account1.get_balance()}")
    print(f"{account2.account_holder}: {account2.get_balance()}")
    print(f"{account3.account_holder}: {account3.get_balance()}")
    
    print(f"Account 1 transactions: {account1._transaction_count}")
    print(f"Account 2 transactions: {account2._transaction_count}")
    print(f"Account 3 transactions: {account3._transaction_count}")

elif test_case == "stress_test":
    # Çok sayıda işlem ile performans testi
    account = BankAccount("Stress Tester", "11111")
    for _ in range(1000):
        account.deposit(1)
    print(f"Final balance: {account.get_balance()}")
    print(f"Transaction count: {account._transaction_count}")
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