Modyfikatory dostępu
Część sekcji Programowanie obiektowe ścieżki Python w Coddy. Lekcja 29 z 64.
Modyfikatory dostępu kontrolują widoczność atrybutów i metod klasy. Python używa konwencji nazewnictwa zamiast słów kluczowych do kontroli dostępu.
Oto przykład dostępu publicznego (bez prefiksu):
class Person:
def __init__(self):
self.name = "Coddy" # Atrybut publiczny
def greet(self): # Metoda publiczna
return f"Hello, I'm {self.name}"Dostęp do publicznych składowych z dowolnego miejsca:
person = Person()
print(person.name) # Coddy
print(person.greet()) # Hello, I'm CoddyOto przykład dostępu chronionego (pojedyncze podkreślenie):
class Employee:
def __init__(self):
self._salary = 50000 # Atrybut chroniony
def _calculate_bonus(self): # Metoda chroniona
return self._salary * 0.1
def show_bonus(self):
return self._calculate_bonus() # Można używać wewnątrz klasyDostęp do składowych chronionych (działa, ale nie jest zalecany):
employee = Employee()
print(employee._salary) # 50000 - działa, ale nie jest zalecane
print(employee.show_bonus()) # 5000.0 - właściwy sposóbOto przykład dostępu prywatnego (podwójne podkreślenie):
class User:
def __init__(self):
self.__password = "secure123" # Atrybut prywatny
def __encrypt(self, data): # Metoda prywatna
return f"Encrypted: {data}"
def verify(self, input_password):
# Składowe prywatne dostępne wewnątrz klasy
return input_password == self.__passwordPoprawnie używaj elementów prywatnych:
user = User()
print(user.verify("secure123")) # True - użycie metody publicznej
# print(user.__password) # AttributeError - nie można uzyskać bezpośredniego dostępuWynik:
Coddy
Hello, I'm Coddy
50000
5000.0
TrueNajważniejsze: Modyfikatory dostępu w Pythonie to konwencje nazewnictwa: brak prefiksu = publiczny (dostępny wszędzie), pojedynczy podkreślnik = chroniony (do użytku wewnętrznego), podwójny podkreślnik = prywatny (tylko w obrębie klasy). Pomagają one wyznaczać jasne granice i zapobiegać przypadkowemu niewłaściwemu użyciu elementów wewnętrznych klasy.
Wyzwanie
ŚredniW tym wyzwaniu zaimplementujesz klasę FileManager, która pokazuje modyfikatory dostępu w Pythonie (publiczne, chronione i prywatne), a przy tym pozwala poznać zalety kompleksowego testowania.
Edytuj plik filemanager.py, aby zaimplementować klasę FileManager zgodnie z komentarzami TODO. Plik zawiera szczegółowe instrukcje dotyczące implementacji:
- Publicznych metod do operacji na plikach
- Chronionych metod (z prefiksem w postaci pojedynczego podkreślenia)
- Prywatnych metod (z prefiksem w postaci podwójnego podkreślenia)
- Interakcji między metodami pokazujących enkapsulację
Spróbuj swoich sił
from file_manager import FileManager
# Kompleksowa obsługa przypadków testowych
test_case = input()
if test_case == "basic_test":
# Utwórz instancję FileManager
manager = FileManager()
# Wywołaj metodę read_file
print(manager.read_file("example.txt"))
# Wywołaj metodę get_file_content
print(manager.get_file_content("example.txt"))
elif test_case == "protected_access":
# Utwórz instancję FileManager
manager = FileManager()
# Spróbuj wywołać metodę chronioną
# Metody chronione są dostępne, ale przeznaczone do użytku wewnętrznego
print(manager._check_permissions("example.txt"))
print("Note: Protected methods are accessible but intended for internal use only")
elif test_case == "private_access":
# Utwórz instancję FileManager
manager = FileManager()
try:
# Spróbuj wywołać metodę prywatną bezpośrednio
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")
# Uzyskaj dostęp, używając nazwy po przekształceniu
print(manager._FileManager__decrypt_content("some content"))
print("Note: Accessed private method using name-mangled form")
elif test_case == "method_chaining":
# Utwórz instancję FileManager
manager = FileManager()
# Pokaż, jak get_file_content wewnętrznie wywołuje zarówno metodę chronioną, jak i prywatną
print("Calling get_file_content which internally uses protected and private methods:")
print(manager.get_file_content("example.txt"))
elif test_case == "multiple_files":
# Utwórz instancję FileManager
manager = FileManager()
# Przetwórz wiele plików
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":
# Utwórz instancję FileManager
manager = FileManager()
# Zademonstruj przekształcanie nazw
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")Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektyParametr selfMetodyAtrybutyMetoda konstruktora (__init__)Powtórzenie – prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaFunkcja super()Nadpisywanie metodDziedziczenie wielokrotneKolejność rozwiązywania metodPodsumowanie – hierarchia pracowników7Metody specjalne
Wprowadzenie do metod magicznychPrzeciążanie operatorówMagiczne metody kontenerówPowtórka – własna lista10Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy2Dekoratory
Wprowadzenie do dekoratorówDekorator propertyDekorator metody statycznejDekorator metody klasowej5Polimorfizm
Ponowne omówienie nadpisywania metodTypowanie kaczeKlasy i metody abstrakcyjneProjektowanie interfejsówPodsumowanie — kalkulator kształtów8Zaawansowane koncepcje programowania obiektowego
Kompozycja a dziedziczenieMiksyMetody statyczne i klasoweDekoratory klasMenedżery kontekstu11Wzorce projektowe, część 2
Wzorzec PolecenieWzorzec AdapterWzorzec DekoratorWzorzec Metoda szablonowaWzorzec StanWzorzec Kompozyt3Właściwości klas
Zmienne instancji a zmienne klasoweDekoratory właściwościAtrybuty prywatnePowtórzenie — menedżer kont bankowych6Hermetyzacja
Public, Protected, Private — pamięćModyfikatory dostępuUkrywanie informacjiDekoratory właściwości — zaawansowanePodsumowanie — system ewidencji uczniów12Projekt: System zarządzania biblioteką
Przegląd projektuKlasy Book i UserSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraTestowanie i integracjaPoćwicz samodzielnie: Kompilator Python online