我正在使用h5py访问HDF5文件并将h5py文件对象存储在一个类中。但是,当我尝试重新分配已关闭的h5py文件实例变量时,出现了一些奇怪的行为:
class MyClass:
def __init__(self, filename):
self.h5file = None
self.filename = filename
def vartest(self):
self.h5file = h5py.File(self.filename, 'r')
print self.h5file
self.h5file.close()
print self.h5file
newh5file = h5py.File(self.filename, 'r')
print newh5file
self.h5file = newh5file
print self.h5file
print newh5file
def main():
filename = sys.argv[1]
mycls = MyClass(filename)
mycls.vartest()
输出:
<HDF5 file "test.h5" (mode r, 92.7M)>
<Closed HDF5 file>
<HDF5 file "test.h5" (mode r, 92.7M)>
<Closed HDF5 file>
<Closed HDF5 file>
尝试使用新打开的h5py文件对象更新实例变量似乎在某种程度上影响了该对象的状态,从而导致其关闭。无论h5py方面如何实现,我都不明白这种行为如何符合我对Python语言的理解(即没有重载赋值运算符)。这个示例是在Python 2.6.5和h5py 1.3.0上运行的。如果您想尝试此示例但没有HDF5文件,请将文件访问模式从“r”更改为“a”。
self.h5file = newh5file
代码行注释掉,它是否会打印“closed”?self.h5file
是一个property吗?h5py.File()
保持一些全局状态吗? - jfsself.h5file = newh5file
,有趣的是,newh5file
和self.h5file
(我明确关闭了)都显示为打开<HDF5 file "test.h5" (mode r, 800 bytes)>
。这个例子是自包含的,self.h5file
不是一个属性。我不能告诉你太多关于h5py.File()
的实现,我不会感到惊讶如果有一些全局状态,但我不理解如何简单地分配一个实例变量就改变了那个全局状态(某处正在进行引用计数吗?)。 - David Eklund