gpt4 book ai didi

在 __del__ 中关闭类连接对象的 Pythonic 方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:00:13 25 4
gpt4 key购买 nike

我正在开发一个实现上下文管理器的类似连接的对象。强烈鼓励写这样的东西:

with MyConnection() as con:
# do stuff

当然也可以这样做:

con = MyConnection()
# do stuff
con.close()

但是无法关闭连接是相当有问题的。所以关闭 __del__() 似乎是个好主意:

def __del__(self):
self.close()

这看起来很不错,但有时会导致错误:

Exception ignored in: [...]
Traceback (most recent call last):
File "...", line xxx, in __del__()
TypeError: 'NoneType' object is not callable

__del__() 被调用时,有时 close 方法似乎已经被销毁了。

所以我正在寻找一种鼓励 python 在销毁时正确关闭连接的好方法。如果可能的话,我想避免 close()__del__()

中的代码重复

最佳答案

如果你真的想阻止用户不关闭连接,你可以只在 __enter__ 中初始化它,或者你可以添加一个标志来表明它没有被上下文管理器初始化.例如,类似

class MyConnection(object):

safely_initialized = False

def __enter__(self):
# Init your connection
self.safely_initialized = True
return self

def do_something(self):
if not self.safely_initialized:
raise Exception('You must initialize the connection with a context manager!')
# Do something

def __exit__(self, type, value, traceback):
  # Close your connection

除非在上下文管理器中,否则不会初始化连接。

关于在 __del__ 中关闭类连接对象的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24611529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com