Oprettelse af brugerdefinerede kontekstadministratorer
Stryg for at vise menuen
For at udnytte kraften i context managers fuldt ud i Python, kan du oprette dine egne ved at definere en klasse, der implementerer metoderne __enter__ og __exit__. Metoden __enter__ kaldes, når eksekveringen går ind i konteksten af with-sætningen, og dens returværdi tildeles variablen efter as. Metoden __exit__ kaldes, når eksekveringen forlader konteksten, uanset om det sker normalt eller på grund af en undtagelse. Dette design gør det muligt at opsætte og nedbryde ressourcer sikkert og forudsigeligt, hvilket især er nyttigt til håndtering af filer, netværksforbindelser eller låse.
Metoden __exit__ modtager tre argumenter: exc_type, exc_value og traceback. Disse giver detaljer om eventuelle undtagelser, der opstod inden for kontekstblokken. Hvis __exit__ returnerer True, undertrykkes undtagelsen; ellers vil undtagelsen blive videreført efter oprydning. Ved at implementere disse metoder kan du præcist kontrollere opsætning og oprydning for din ressource, hvilket gør din kode mere robust og vedligeholdelsesvenlig.
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ølgende kode demonstrerer en brugerdefineret context manager-klasse FileLogger. Denne klasse er designet til at åbne en mål-fil til læsning og en logfil til at tilføje logposter. Når konteksten indtrædes (ved brug af with-sætningen), logges filåbningshændelsen. Når konteksten forlades – uanset om det sker ved normal eksekvering eller en undtagelse – logges fil-lukningshændelsen, og begge filer lukkes korrekt. Metoden __exit__ undertrykker ikke undtagelser, hvilket betyder, at de vil blive videreført efter oprydning.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat