我的代码包含一些通过Pythons"使用"声明,以确保他们得到拯救关闭。
现在我想创建一个方法可以与这些对象交互的类。
例如,我的代码实际上是这样的:
with ... as a, with ... as b:
# do something with a and b here
call_method(a, b) # pass a and b here
我想把它放到一个班级,所以看起来像#34;喜欢"这样:
class Something(object):
def __init__(self):
with ... as a:
self.a = a
with ... as b:
self.b = b
def do_something(self):
# do something with self.a and self.b
self.call_method(self.a, self.b)
def call_method(self, a, b)
# do more with a, b
物品需要保持打开状态"一直以来。
我不知道如何实现这一目标,所以我该怎么做?
答案 0 :(得分:0)
您的班级中没有要管理的“上下文”,请勿在{{1}}中使用with
。您必须以其他方式关闭文件。
如果您希望在方法中存在异常时关闭文件对象,则可以始终使用__init__
,try:
:
finally:
但是如果你真的希望它们在那时关闭的话,它在很大程度上取决于你想对这些文件做些什么。
如果您的实例本身应该在特定的上下文中使用(例如,有一段代码而不是开头和结尾,在此期间您的实例应该打开文件),那么您可以创建类通过实施context manager special methods来完成上下文管理器。
作为类API的设计者,您将知道文件需要保留多长时间。这在很大程度上取决于关闭文件时实例的使用方式。
答案 1 :(得分:0)
你可以让你的班级本身成为一个上下文管理员:
class Something(object):
def __init__(self):
self.a = a
self.b = b
def __enter__(self):
self.a_e = a.__enter__(self)
self.b_e = b.__enter__(self)
def __exit__(self, *x):
xb = False
try:
xb = self.b_e(*x)
finally:
xa = self.a_e(*x)
return xa or xb # make sure both are called.
def do_something(self):
# do something with self.a and self.b
# - or, if present, with a_e, b_e
self.call_method(self.a, self.b)
def call_method(self, a, b)
# do more with a, b
这只是一个原始想法。为了使其正常运行,您必须使用try:
except:
finally:
执行更多操作。
您可以随后使用
with Something(x, y) as sth:
sth.do_something()
它正确地__enter__()
和__exit__()
编辑。