我已经搜查,我无法想出任何好的理由使用Python的__enter__
/__exit__
而不是__init__
(或__new__
?)/ __del__
。Python的__enter__/__exit__ VS __init__(或__new__)/ __del__
据我所知,__enter__
/__exit__
旨在与with
语句一起用作上下文管理器,而with
语句非常好。但与此相对应的是,那些块中的任何代码都是在该上下文中执行的只有。通过使用这些而不是__init__
/__del__
我似乎与呼叫者创建了一个隐式合同,他们必须使用with
,但是没有办法执行这样的合同,并且合同只通过文档(或阅读代码)进行通信。这似乎是一个坏主意。
我似乎在with
块内使用__init__
/__del__
获得相同的效果。但通过使用它们而不是上下文管理方法,我的对象在其他场景中也很有用。
那么有人可以拿出一个令人信服的理由,为什么我会曾经想使用上下文管理方法而不是构造/析构函数?
如果有更好的地方提出这样的问题,请让我知道,但似乎没有太多关于这方面的好消息。
追问:
这个问题是基于一个坏的(但很可能常见)的假设,因为我总是用with
实例化一个新的对象,在这种情况下__init__/__del__
非常接近相同的行为__enter__/__exit__
(除了您无法控制何时或是否会执行__del__
,取决于垃圾回收,并且如果该进程首先终止,则可能永远不会调用该进程)。但是如果你在with
声明中使用预先存在的对象,它们当然是完全不同的。
何时(甚至是)'__del__'被调用是不确定的。通过依赖'__del__'进行清理,可能会丢失数据。 – user2357112
可能的重复:http://stackoverflow.com/a/6772907/674039 – wim