Context Manager
Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 41 von 64.
Kontext-Manager ermöglichen es Ihnen, Ressourcen genau dann zuzuweisen und freizugeben, wenn sie benötigt werden. Sie gewährleisten eine ordnungsgemäße Bereinigung, selbst wenn Fehler auftreten.
Hier ist das am häufigsten verwendete Beispiel für die Verwendung der with-Anweisung:
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# Datei wird hier automatisch geschlossenDie Datei wird nach dem Block automatisch geschlossen, selbst wenn eine Ausnahme auftritt.
Erstellen Sie Ihren eigenen Context Manager, indem Sie die Methoden __enter__ und __exit__ implementieren:
class MyContext:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Exiting the context")
return False # Keine Ausnahmen unterdrückenVerwenden Sie Ihren benutzerdefinierten Context Manager:
with MyContext() as ctx:
print("Inside the context")Ausgabe:
Entering the context
Inside the context
Exiting the contextErstellen Sie einen praktischeren Context Manager für Datenbankverbindungen:
class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
self.connection = None
def __enter__(self):
print(f"Connecting to {self.db_name}")
self.connection = f"Connection to {self.db_name}"
return self.connection
def __exit__(self, exc_type, exc_val, exc_tb):
print(f"Closing connection to {self.db_name}")
self.connection = None
with DatabaseConnection("users_db") as conn:
print(f"Using {conn}")
print("Performing database operations...")Ausnahmen in Kontext-Managern behandeln:
class SafeContext:
def __enter__(self):
print("Setting up resources")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Cleaning up resources")
if exc_type:
print(f"An exception occurred: {exc_val}")
return False # Die Ausnahme nicht unterdrücken
with SafeContext():
print("Working with resources")
# raise ValueError("Something went wrong") # Zum Testen einkommentierenAusgabe:
Connecting to users_db
Using Connection to users_db
Performing database operations...
Closing connection to users_db
Setting up resources
Working with resources
Cleaning up resourcesDie __exit__-Methode erhält drei Parameter:
exc_type: Ausnahmetyp (oder None)exc_val: Ausnahmewert (oder None)exc_tb: Ausnahme-Traceback (oder None)
Wichtiger Punkt: Kontextmanager verwenden die Methoden __enter__ und __exit__, um Ressourcen zu verwalten. Die with-Anweisung ruft diese Methoden automatisch auf und stellt so die ordnungsgemäße Einrichtung und Bereinigung sicher. Dies ist besonders nützlich für Dateien, Datenbankverbindungen und andere Ressourcen, die eine garantierte Bereinigung erfordern.
Aufgabe
EinfachIn dieser Herausforderung implementieren Sie eine Context-Manager-Klasse, die die verstrichene Zeit zwischen dem Betreten und Verlassen eines Kontextblocks misst.
timer.py– Enthält die Implementierung der KlasseTimer(dies ist die Datei, die Sie bearbeiten werden)driver.py– Enthält umfassende Testfälle (nicht ändern)
Implementieren Sie den Context-Manager Timer in timer.py gemäß den TODO-Kommentaren. Die Klasse sollte:
- Die Startzeit beim Betreten eines Kontexts aufzeichnen
- Die Endzeit beim Verlassen aufzeichnen
- Die verstrichene Zeit berechnen und anzeigen
Spickzettel
Context Manager weisen Ressourcen genau dann zu und geben sie wieder frei, wenn sie benötigt werden, wodurch eine ordnungsgemäße Bereinigung sichergestellt wird, selbst wenn Fehler auftreten.
Verwenden Sie die with-Anweisung für die automatische Ressourcenverwaltung:
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# Datei wird hier automatisch geschlossenErstellen Sie benutzerdefinierte Context Manager, indem Sie die Methoden __enter__ und __exit__ implementieren:
class MyContext:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Exiting the context")
return False # Ausnahmen nicht unterdrücken
with MyContext() as ctx:
print("Inside the context")Die Methode __exit__ erhält drei Parameter:
exc_type: Ausnahmetyp (oder None)exc_val: Ausnahmewert (oder None)exc_tb: Ausnahme-Traceback (oder None)
Behandeln Sie Ausnahmen in Context Managern:
class SafeContext:
def __enter__(self):
print("Setting up resources")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Cleaning up resources")
if exc_type:
print(f"An exception occurred: {exc_val}")
return False # Die Ausnahme nicht unterdrückenProbier es selbst
from timer import Timer
import time
# Testfall-Handler
test_case = input()
if test_case == "basic_test":
# Test der Basisfunktionalität
with Timer():
# Simuliere etwas Arbeit
time.sleep(2) # Dies lässt das Programm für 2 Sekunden warten
elif test_case == "nested_contexts":
# Teste verschachtelte Kontext-Manager
with Timer():
time.sleep(1)
with Timer():
time.sleep(1)
elif test_case == "exception_handling":
# Teste Ausnahmebehandlung innerhalb des Kontexts
try:
with Timer():
time.sleep(1)
raise ValueError("Test exception")
except ValueError as e:
print(f"Caught exception: {e}")
elif test_case == "zero_sleep":
# Test mit minimaler Wartezeit
with Timer():
time.sleep(0.001)
elif test_case == "multiple_timers":
# Teste mehrere Timer nacheinander
with Timer():
time.sleep(1)
with Timer():
time.sleep(0.5)
with Timer():
time.sleep(2)
elif test_case == "as_decorator":
# Teste Timer in einem Funktionskontext
def timed_function():
with Timer():
time.sleep(2)
timed_function()
else:
# Standardtest - Basisfunktionalität
with Timer():
# Simuliere etwas Arbeit
time.sleep(2) # Dies lässt das Programm für 2 Sekunden warten
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktor-Methode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDie super()-FunktionMethoden überschreibenMehrfachvererbungMethod Resolution OrderZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden
Einführung in Magic MethodsOperator-ÜberladungMagic Methods für ContainerRückblick - Eigene Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung2Dekoratoren
Einführung in DekoratorenProperty-DekoratorStatischer Methoden-DekoratorKlassenmethoden-Dekorator5Polymorphismus
Methoden-Überschreiben vertieftDuck TypingAbstrakte Klassen und MethodenInterface-DesignZusammenfassung – Formen-Rechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische und KlassenmethodenKlassendekoratorenContext Manager3Klasseneigenschaften
Instanz- vs. KlassenvariablenProperty-DekoratorenPrivate AttributeZusammenfassung – Bankkonto-Manager6Kapselung
Public, Protected, Private MemberZugriffsmodifikatorenInformation HidingProperty-Decorators für FortgeschritteneZusammenfassung - Studentenverwaltungssystem12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen