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._balancePublic (genel) üyelere her yerden erişin:
account = BankAccount("Alice", 1000, "12345")
print(account.owner) # Alice
account.deposit(500) # Sorunsuz çalışırKorumalı ü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) # 12345Korumalı (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.
Görev
OrtaBu 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
- Gerekli işlevselliği uygulamak için
bankaccount.pydosyasındaki TODO yorumlarını takip edin - Belirtildiği şekilde uygun erişim seviyelerini (public, protected, private) uygulayın
- 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) # 12345Alt 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}")
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ı3Sınıf Özellikleri
Örnek ve Sınıf DeğişkenleriProperty DekoratörleriGizli ÖzniteliklerÖzet - Banka Hesabı Yöneticisi6Kapsülleme
Public, Protected, Private ÜyelerErişim BelirleyicilerBilgi Gizlemeİleri Seviye Property DekoratörleriÖzet - Öğrenci Kayıt Sistemi