Python 将来自的结果分配给。。。作为对self.bar的声明

Python 将来自的结果分配给。。。作为对self.bar的声明,python,Python,在Python类中,一个方法打开了一个文件,但它是另一个实际使用file对象的方法。所以我写: def first_method(self): with open(FILE) as f: self.output = f self.another_method() def another_method(self): self.output.write(DATA) 正如您所看到的,另一个\u方法由中的第一个\u方法调用,使用。。。作为scope,因

在Python类中,一个方法打开了一个文件,但它是另一个实际使用file对象的方法。所以我写:

def first_method(self):
    with open(FILE) as f:
        self.output = f
        self.another_method()

def another_method(self):
    self.output.write(DATA)
正如您所看到的,
另一个\u方法
中的
第一个\u方法
调用,使用。。。作为
scope,因此我确信
另一个\u方法
将在
第一个\u方法
退出
之前使用。。。作为
范围-它可以工作。然而,我对这句话感到困惑:

self.output = f
将<代码>的结果与。。。作为另一个函数中的语句?这会导致意外或无法控制的行为吗

而且,
另一种方法
并不是唯一使用
f
的地方。实际上,
另一种方法
是一种协同程序,其中许多方法将异步写入
f
。因此,我必须在
另一种方法之外打开文件

还有许多其他上下文管理器面临同样的问题,如
aiohttp.ClientSession
tqdm.tqdm
。将它们作为参数传递将导致参数过多


实际上,问题是在我写的时候出现的。

with
语句导致在块的末尾自动执行对象的
\uuuuuuuuuuu
方法。可以合理地假设,在
\uuuu退出\uuuu
之后,对象处于不可用状态,即使您仍然有对它的引用。将其保存为对象属性是不明智的


在您的具体示例中,您最好将文件作为参数显式传递给另一个方法

@PM2Ring谢谢,我已经编辑了这个问题。这是。如果
另一个\u方法
是唯一使用
f
的地方,那么它可能应该打开文件本身。我曾考虑过将文件作为参数传递,但会有太多的参数。@CSM不确定如何将一个参数添加到一个方法中突然变成“太多”。也许你可以在你的问题中对此进行一点扩展?@MarkRansom还有一些其他对象,比如“aiohttp.ClientSession”,也面临同样的问题。我已经编辑了这个问题。@CSM为什么不将文件名保存在self.output中,然后在需要写入文件的任何方法中使用
with
语句打开它?