Der Gültigkeitsbereich der in einer with
-Anweisung erstellten Variablen liegt außerhalb des with
Blocks (siehe: Variable defined with with-statement available outside of with-block?). Aber wenn ich den folgenden Code ausführen:Warum wird __del__ am Ende eines with-Blocks aufgerufen?
class Foo:
def __init__(self):
print "__int__() called."
def __del__(self):
print "__del__() called."
def __enter__(self):
print "__enter__() called."
return "returned_test_str"
def __exit__(self, exc, value, tb):
print "__exit__() called."
def close(self):
print "close() called."
def test(self):
print "test() called."
if __name__ == "__main__":
with Foo() as foo:
print "with block begin???"
print "with block end???"
print "foo:", foo # line 1
print "-------- Testing MySQLdb -----------------------"
with MySQLdb.Connect(host="xxxx", port=0, user="xxx", passwd="xxx", db="test") as my_curs2:
print "(1)my_curs2:", my_curs2
print "(1)my_curs2.connection:", my_curs2.connection
print "(2)my_curs2.connection:", my_curs2.connection
print "(2)my_curs2.connection.open:", my_curs2.connection.open # line 2
Die Ausgabe zeigt, dass Foo.__del__
vor dem Drucken foo genannt wird (bei # line 1
oben):
__int__() called.
__enter__() called.
with block begin???
with block end???
__exit__() called.
__del__() called.
foo: returned_test_str
-------- Testing MySQLdb -----------------------
(1)my_curs2: <MySQLdb.cursors.Cursor object at 0x7f16dc95b290>
(1)my_curs2.connection: <_mysql.connection open to 'xxx' at 2609870>
(2)my_curs2.connection: <_mysql.connection open to 'xxx' at 2609870>
(2)my_curs2.connection.open: 1
Meine Frage ist, warum ist Foo.__del__
hier genannt wird, wenn die with
Anweisung erstellt keinen neuen Ausführungsbereich?
Auch wenn die __del__
der Verbindungsmethode in dem zweiten with
Block genannt wird, verstehe ich nicht, warum my_curs1.connection
nachher noch offen ist (# line 2
siehe oben).
Mögliche Duplikate von [Kann ich mit Anweisung mit MySQLdb.Connection-Objekt verwenden?] (Http://stackoverflow.com/questions/11751703/cani-i-use-with-statement-with-mysqldb-connection-object) – tzaman
Chengcheng, siehe @ Tzaman Link für die Antwort auf Ihre zweite Frage, und entfernen Sie diesen Teil von Ihrer Frage. Wenn Sie ein Problem auf eine Frage beschränken, bleibt StackOverflow aufgeräumt und die Benutzer können schneller Antworten finden. Vielen Dank! – CodeMouse92
@tzaman Diese Frage ist 3 Jahre alt und ihre Antwort ist falsch. – Air