class Package:
def __init__(self):
self.files = []
# ...
def __del__(self):
for file in self.files:
os.unlink(file)
Run Code Online (Sandbox Code Playgroud)
__del__(self)上面因AttributeError异常而失败.我理解Python在__del__()调用时不保证存在"全局变量"(在此上下文中的成员数据?).如果是这种情况并且这是异常的原因,我该如何确保对象正确破坏?
我在某人的代码中看到了这个.这是什么意思?
def __enter__(self):
return self
def __exit__(self, type, value, tb):
self.stream.close()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud) 在这个相关问题之后,虽然总是有一些库以独特的方式使用语言功能的例子,但我想知道返回方法以外的值是否self应该__enter__被视为反模式。
在我看来,这似乎是一个坏主意的主要原因是它使包装上下文管理器出现问题。例如,在 Java 中(也可能在 C# 中),可以将一个AutoCloseable类包装在另一个类中,该类将负责内部类之后的清理工作,如以下代码片段所示:
try (BufferedReader reader =
new BufferedReader(new FileReader("src/main/resources/input.txt"))) {
return readAllLines(reader);
}
Run Code Online (Sandbox Code Playgroud)
在这里,BufferedReader包装FileReader,并在其自己的方法中调用FileReader的方法。但是,如果这是 Python,并且会在其方法中返回 self 以外的对象,则这将使这种安排变得更加复杂。作者必须解决以下问题:close()close()FileReader__enter__BufferedReader
FileReader自己的方法时,是FileReader直接使用还是使用其方法返回的对象__enter__?返回的对象甚至支持哪些方法?__exit__方法中,我需要仅关闭FileReader对象,还是方法中返回的对象__enter__?__enter__如果在调用时实际上返回一个不同的对象,会发生什么?我现在是否需要保留它返回的所有不同对象的集合,以防有人__enter__多次调用我?当我需要使用这些对象时,我如何知道使用哪一个?而这样的例子不胜枚举。解决所有这些问题的一种半成功的解决方案是简单地避免一个上下文管理器类在另一个上下文管理器类之后进行清理。在我的示例中,这意味着我们需要两个嵌套with块 - 一个用于FileReader,另一个用于BufferedReader。然而,这使得我们编写更多的样板代码,并且看起来明显不太优雅。
总而言之,这些问题让我相信,虽然 Python 确实允许我们返回方法self中以外的内容__enter__,但这种行为应该避免。对于这些问题有官方或半官方的表态吗?负责任的 Python 开发人员应该如何编写解决这些问题的代码?