Skapa Egna Kontexthanterare
Svep för att visa menyn
För att fullt ut utnyttja kraften hos context managers i Python kan du skapa egna genom att definiera en klass som implementerar metoderna __enter__ och __exit__. Metoden __enter__ anropas när exekveringen går in i kontexten för with-satsen, och dess returvärde tilldelas variabeln efter as. Metoden __exit__ anropas när exekveringen lämnar kontexten, oavsett om det sker normalt eller på grund av ett undantag. Denna design gör det möjligt att säkert och förutsägbart hantera uppsättning och nedmontering av resurser, vilket är särskilt användbart för hantering av filer, nätverksanslutningar eller lås.
Metoden __exit__ tar emot tre argument: exc_type, exc_value och traceback. Dessa ger information om eventuella undantag som inträffat inom kontextblocket. Om __exit__ returnerar True undertrycks undantaget; annars kommer undantaget att fortsätta efter städningen. Genom att implementera dessa metoder kan du exakt styra logiken för uppsättning och städning av dina resurser, vilket gör din kod mer robust och underhållbar.
class FileLogger:
def __init__(self, filename, logname):
self.filename = filename
self.logname = logname
self.file = None
self.log = None
def __enter__(self):
self.file = open(self.filename, "r")
self.log = open(self.logname, "a")
self.log.write(f"Opened file: {self.filename}\n")
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
self.log.write(f"Closed file: {self.filename}\n")
if self.log:
self.log.close()
# Do not suppress exceptions
return False
Följande kod visar en anpassad context manager-klass FileLogger. Denna klass är utformad för att öppna en målfil för läsning och en loggfil för att lägga till loggposter. Vid inmatning i kontexten (med with-satsen) loggas händelsen att filen öppnas. Vid utträde ur kontexten – oavsett om det sker genom normal exekvering eller ett undantag – loggas händelsen att filen stängs och båda filerna stängs korrekt. Metoden __exit__ undertrycker inte undantag, vilket gör att de fortsätter efter städningen.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal