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._balanceGenel üyelerine 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 ü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) # 12345protected 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.
Görev
OrtaBu 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
- Gerekli işlevleri uygulamak için
bankaccount.pyiçindeki TODO yorumlarını takip et - Belirtildiği şekilde uygun erişim düzeylerini (public, protected, private) uygula
- 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}")
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
1Nesne Yönelimli Programlamanın Temelleri
Nesne Yönelimli Programlamaya GirişHarici DosyalarSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerKurucu Metot (__init__)Tekrar - 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 SistemiKendi başına pratik yap: Online Python derleyicisi