579 Stimmen

Erklärungen zu Pythons '__enter__' und '__exit__'

Ich habe dies im Code von jemandem gesehen. Was bedeutet das?

    def __enter__(self):
        return self

    def __exit__(self, type, value, tb):
        self.stream.close()

from __future__ import with_statement#for python2.5 

class a(object):
    def __enter__(self):
        print 'sss'
        return 'sss111'
    def __exit__(self ,type, value, traceback):
        print 'ok'
        return False

with a() as s:
    print s

print s

7voto

Rohola Zandie Punkte 675

Dies wird als Kontextmanager bezeichnet, und ich möchte nur hinzufügen, dass es ähnliche Ansätze für andere Programmiersprachen gibt. Ein Vergleich könnte für das Verständnis des Kontextmanagers in Python hilfreich sein. Grundsätzlich wird ein Kontextmanager verwendet, wenn wir es mit einigen Ressourcen zu tun haben (Datei, Netzwerk, Datenbank), die initialisiert und zu einem bestimmten Zeitpunkt wieder abgebaut (entsorgt) werden müssen. In Java 7 und darüber hinaus haben wir eine automatische Ressourcenverwaltung, die die Form von:

//Java code
try (Session session = new Session())
{
  // do stuff
}

Beachten Sie, dass Session implementieren muss AutoClosable oder eine ihrer (vielen) Unterschnittstellen.

Sur C# haben wir Verwendungsnachweise für die Verwaltung von Ressourcen in der Form von:

//C# code
using(Session session = new Session())
{
  ... do stuff.
}

In dem Session sollte umsetzen IDisposable .

Sur python sollte die Klasse, die wir verwenden, Folgendes implementieren __enter__ y __exit__ . Es hat also die Form von:

#Python code
with Session() as session:
    #do stuff

Und wie bereits von anderen erwähnt, können Sie in allen Sprachen die try/finally-Anweisung verwenden, um denselben Mechanismus zu implementieren. Dies ist nur syntaktischer Zucker.

2voto

Viraj Dhanushka Punkte 39

Python-Aufrufe __enter__ wenn die Ausführung in den Kontext der with-Anweisung eintritt und es an der Zeit ist, die Ressource zu erwerben. Wenn die Ausführung den Kontext wieder verlässt, ruft Python __exit__ um die Ressource freizugeben

Betrachten wir die Kontext-Manager und die "with"-Anweisung in Python. Context Manager ist ein einfaches "Protokoll" (oder eine Schnittstelle), das Ihr Objekt befolgen muss, damit es mit der with-Anweisung verwendet werden kann. Im Grunde müssen Sie nur Folgendes hinzufügen eingeben. y Ausgang Methoden zu einem Objekt hinzufügen, wenn es als Kontextmanager fungieren soll. Python ruft diese beiden Methoden zu den entsprechenden Zeitpunkten im Zyklus der Ressourcenverwaltung auf.

Schauen wir uns einmal an, wie dies in der Praxis aussehen würde. So könnte eine einfache Implementierung des open()-Kontextmanagers aussehen:

class ManagedFile:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        self.file = open(self.name, 'w')
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.file:
            self.file.close()

Unsere Klasse ManagedFile folgt dem Protokoll des Kontextmanagers und unterstützt nun die With-Anweisung.

>>> with ManagedFile('hello.txt') as f:
...    f.write('hello, world!')
...    f.write('bye now')`enter code here`

Python-Aufrufe eingeben. wenn die Ausführung in den Kontext der with-Anweisung eintritt und es an der Zeit ist, die Ressource zu erwerben. Wenn die Ausführung den Kontext wieder verlässt, ruft Python Ausgang um die Ressource freizugeben.

Das Schreiben eines klassenbasierten Kontextmanagers ist nicht die einzige Möglichkeit, die With-Anweisung in Python zu unterstützen. Das Dienstprogramm contextlib in der Standardbibliothek bietet einige weitere Abstraktionen, die auf dem grundlegenden Kontextmanagerprotokoll aufbauen. Dies kann Ihr Leben ein wenig einfacher machen, wenn Ihre Anwendungsfälle mit dem übereinstimmen, was von contextlib angeboten wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X