Kontextmanager
Teil des Abschnitts Objektorientierte Programmierung der Python-Journey von Coddy. Lektion 41 von 64.
Kontextmanager ermöglichen es dir, Ressourcen genau dann zuzuweisen und freizugeben, wenn sie benötigt werden. Sie stellen eine ordnungsgemäße Bereinigung sicher, selbst wenn Fehler auftreten.
Hier ist das häufigste Beispiel mit 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.
Erstelle deinen eigenen Kontextmanager, indem du die Methoden __enter__ und __exit__ implementierst:
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 # Exceptions nicht unterdrückenVerwende deinen benutzerdefinierten Kontextmanager:
with MyContext() as ctx:
print("Inside the context")Ausgabe:
Entering the context
Inside the context
Exiting the contextErstelle einen praktischeren Kontextmanager 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 Kontextmanagern 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 Kommentar entfernenAusgabe:
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 Methode __exit__ 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 gewährleistet so eine ordnungsgemäße Einrichtung und Bereinigung. Dies ist besonders nützlich für Dateien, Datenbankverbindungen und andere Ressourcen, die eine garantierte Bereinigung benötigen.
Aufgabe
EinfachIn dieser Herausforderung implementierst du 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 du bearbeiten wirst)driver.py– Enthält umfassende Testfälle (nicht ändern)
Implementiere den Timer-Context-Manager in timer.py gemäß den TODO-Kommentaren. Die Klasse sollte:
- Beim Betreten eines Kontexts die Startzeit aufzeichnen
- Beim Verlassen die Endzeit aufzeichnen
- Die verstrichene Zeit berechnen und anzeigen
Probier es selbst
from timer import Timer
import time
# Testfall-Handler
test_case = input()
if test_case == "basic_test":
# Test der grundlegenden Funktionalität
with Timer():
# Simuliere etwas Arbeit
time.sleep(2) # Dies lässt das Programm 2 Sekunden warten
elif test_case == "nested_contexts":
# Test verschachtelter Kontextmanager
with Timer():
time.sleep(1)
with Timer():
time.sleep(1)
elif test_case == "exception_handling":
# Test der 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 minimalem Sleep
with Timer():
time.sleep(0.001)
elif test_case == "multiple_timers":
# Test mehrerer Timer nacheinander
with Timer():
time.sleep(1)
with Timer():
time.sleep(0.5)
with Timer():
time.sleep(2)
elif test_case == "as_decorator":
# Test des Timers in einem Funktionskontext
def timed_function():
with Timer():
time.sleep(2)
timed_function()
else:
# Standardtest - grundlegende Funktionalität
with Timer():
# Simuliere etwas Arbeit
time.sleep(2) # Dies lässt das Programm 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 Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktormethode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDie super()-FunktionMethodenüberschreibungMehrfachvererbungMethodenauflösungsreihenfolgeWiederholung – Mitarbeiterhierarchie7Spezielle Methoden
Einführung in magische MethodenOperatorüberladungMagische Methoden für ContainerRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungsservice2Dekoratoren
Einführung in DekoratorenProperty-DekoratorDekorator für statische MethodenDekorator für Klassenmethoden5Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypingAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische Methoden und KlassenmethodenKlassen-DekoratorenKontextmanager3Klassenattribute
Instanz- vs. KlassenvariablenProperty-DecoratorsPrivate AttributeWiederholung – Bankkontoverwaltung6Kapselung
Öffentliche, geschützte, private MemberZugriffsmodifikatorenInformationsverbergungProperty-Decorators – FortgeschrittenWiederholung – System zur Verwaltung von Studentendaten12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und BenutzerklassenAusleihsystemSuchfunktionAdministrationsoberflächeTests und IntegrationÜbe selbstständig: Online-Python-Compiler