Menu
Coddy logo textTech

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 Coddy

Oto 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 klasy

Dostę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ób

Oto 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.__password

Poprawnie 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ępu

Wynik:

Coddy
Hello, I'm Coddy
50000
5000.0
True

Najważ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.

challenge icon

Wyzwanie

Średni

W 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")
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Python online