我首先应该说这是在IPython中运行,使用Spyder IDE,如果它有所作为。我有点像Python的新手,但能说其他语言。
我有一个实例化并在函数中使用的类,如下所示。我已经从很长的读取和处理算法中简化了代码。这一切都可以在我第一次运行此文件并调用ReadFile()时正常工作。任何子结果都会崩溃,主要是因为m_seclist和m_headers已经包含数据。
我对类的理解来自C ++,PHP和VB,所以我可能会假设,但是当一个类在一个函数(即本地范围)中实例化时,该实例是否应该在结束时被完全销毁。功能?在这种情况下,看起来它肯定不是,或者至少有一些变量存在。我是否误解了Python如何处理类实例?
class Reader:
m_headers = []
m_seclist = []
def __init__(self, filename):
fh = open(filename, 'r')
file_contents = fh.read().splitlines()
fh.close()
dataPointList = []
for line in file_contents:
for each section in the file (more code here)
thisLine = line.split()
dataPointList.append((float(thisLine[1]), float(thisLine[0])))
m_seclist.append(dataPointList)
dataPointList = []
def getData(self, index):
return m_seclist[index][0]
#end of class
def ReadFile(filename):
my_instance = Reader(filename)
output = my_instance.getData(2)
return output
如果我能澄清一些事情,那就大声喊叫。
答案 0 :(得分:2)
您的问题是存储数据的方式:
类属性存储在类中,并在类的所有实例之间共享。
实例属性,而不是每个实例的计数。
而不是
class Reader:
m_headers = []
m_seclist = []
def __init__(self, filename):
DO
class Reader:
def __init__(self, filename):
self.m_headers = []
self.m_seclist = []
...
然后在每种情况下都是新鲜的。
答案 1 :(得分:1)
你误解了类和实例成员。你用它做什么:
class Reader:
m_headers = []
m_seclist = []
是声明类成员。他们活了下来。
你想要的是这个,哦和python中的约定只是加上_
私有成员的前缀。我还添加了声明,它更适合处理需要关闭的资源。
class Reader:
def __init__(self, filename):
self._headers = [] # This creates instance members
self._seclist = []
with open(filename, 'r') as fh: # With statement will auto close fh
file_contents = fh.read().splitlines()
for line in file_contents:
dataPointList = []
for each section in the file (more code here)
thisLine = line.split()
dataPointList.append((float(thisLine[1]), float(thisLine[0])))
self._seclist.append(dataPointList)
def getData(self, index):
return self._seclist[index][0]
def ReadFile(filename):
my_instance = Reader(filename)
output = my_instance.getData(2)
return output