Menu
Coddy logo textTech

Public, Protected, Private Üyeler

Coddy'nin Python Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 28 / 64.

Python, sınıf üyeleri için üç erişim denetimi düzeyine sahiptir: genel, korumalı ve özel. Bunlar, özniteliklere ve yöntemlere nasıl erişilebileceğini denetler.

İş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

Genel üyelerine 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 üyelere erişmeyi deneyin (çift alt çizgi - ad gizleme):

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

# Ama bu çalışır (name mangling):
print(account._BankAccount__account_id)  # 12345

protected ve 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ı - alt sınıfta erişilebilir
    
    def show_id(self):
        # return self.__account_id  # Bu çalışmaz - 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: Public üyelerin ön eki yoktur ve her yerden erişilebilir. Protected üyeler tek alt çizgi (_) kullanır ve yalnızca sınıf hiyerarşisi içinde kullanılmalıdır. Private üyeler çift alt çizgi (__) kullanır ve daha güçlü gizlilik sağlamak için adları değiştirilir. Python'ın erişim denetimi kurallara dayanır; katı bir şekilde uygulanmaz.

challenge icon

Görev

Orta

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

  • bankaccount.py - Uygulamana rehberlik eden TODO yorumlarıyla birlikte sınıf tanımını içerir
  1. Gerekli işlevleri uygulamak için bankaccount.py içindeki TODO yorumlarını takip et
  2. Belirtildiği şekilde uygun erişim düzeylerini (public, protected, private) uygula
  3. Tüm metotların uç durumları (negatif para yatırma işlemleri vb.) uygun şekilde ele aldığından emin ol

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.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Python derleyicisi