Ich habe gesucht und ich bin nicht in der Lage mit jedem guten Grund zu kommen Python __enter__
/__exit__
statt __init__
(oder __new__
?) Des/__del__
zu verwenden.Python __enter__/__exit__ vs __init__ (oder __new__)/__del__
Ich verstehe, dass __enter__
/__exit__
zur Verwendung bestimmt sind, mit der with
Aussage als Kontext-Manager und die with
Aussage ist groß. Aber das Gegenstück dazu ist, dass jeder Code in diesen Blöcken nur in diesem Kontext ausgeführt wird. Durch die Verwendung dieser anstelle von __init__
/__del__
ich scheinen erstellen einen impliziten Vertrag mit Anrufern, dass sie with
verwenden müssen, aber es gibt keine Möglichkeit, einen solchen Vertrag durchzusetzen, und der Vertrag wird nur über die Dokumentation mitgeteilt (oder den Code lesen). Das scheint eine schlechte Idee zu sein.
Ich bekomme den gleichen Effekt mit __init__
/__del__
in einem with
Block. Aber indem ich sie anstelle der Kontextverwaltungsmethoden verwende, ist mein Objekt auch in anderen Szenarien nützlich.
Also kann jemand mit einem überzeugenden Grund, warum würde ich jemals wollen die Kontext-Management-Methoden anstelle der Konstruktor/Destruktor-Methoden?
Wenn es eine bessere Stelle gibt, um eine Frage wie diese zu stellen, lassen Sie es mich bitte wissen, aber es scheint, als gäbe es nicht viele gute Informationen darüber. Up
Folgen:
Diese Frage auf einer schlechte beruhte (aber wahrscheinlich häufig) Annahme, weil ich immer with
verwendet, um ein neues Objekt zu instanziieren, wobei in diesem Fall __init__/__del__
sehr nahe kommt das gleiche Verhalten wie __enter__/__exit__
(außer dass Sie nicht kontrollieren können, ob oder wenn __del__
ausgeführt wird, liegt es an der Garbage Collection und wenn der Prozess zuerst beendet wird, kann er nie aufgerufen werden). Aber wenn Sie bereits vorhandene Objekte in with
Anweisungen verwenden, sind sie natürlich ganz anders.
Wann (und sogar ob) '__del__' aufgerufen wird, ist nicht deterministisch. Sie können Daten verlieren, indem Sie für die Bereinigung von '__del__' abhängig sind. – user2357112
möglich dupe: http://stackoverflow.com/a/6772907/674039 – wim