很明显我在学习如何正确使用课堂上遇到了一些困难。我希望下面的代码循环遍历一组文件(确实如此),在一个集合中添加元素(确实如此),并在该集合移动到新文件时重新启动它(确实如此)。按照我破解下面代码的方式,我希望它每次为file.terminals
返回一个空集合,因为我相信每个集合都是类SrcFile
的新实例的唯一属性。显然,我错了。实际发生的情况是,由第一个文件创建的终端集会为列表中的所有后续文件保留(并添加到中),尽管其他属性(例如file.name
,file.seqlength()
)会随文件而相应更改。有人能解释一下为什么这样做,以及我怎样才能创造出我所期待的行为吗?提前感谢你对一个初级程序员的无知的耐心。
class SrcFile:
terminals = set([])
def __init__(self, which):
self.name = which
def seqlength(self):
with open(self.name) as file:
linecounter = 0
for line in file:
linecounter += 1
if linecounter == 3:
return int(line.split()[0])
break
class Record(SrcFile):
def terminal(self):
record = self.name
def terminal(self):
record = self.name
return record.split()[0]
for f in files:
file = SrcFile(f)
print(file.name, file.seqlength(), file.terminals)
with open(f) as f:
recordline = re.compile(r"^([A-Z]{5})\s{3}")
for line in f:
if recordline.match(line):
record = Record(line)
if record.terminal() in file.terminals:
pass
else:
file.terminals.add(record.terminal())
最佳答案
您在类声明中定义terminals
,而不是在为类的每个新实例执行的__init__
函数中定义。
基本上,terminals
是为整个类初始化的,而不是为类的每个实例初始化的:
>>> SrcFile.terminals
set([])
注意,我运行了
SrcFile.terminals
,而不是SrcFile().terminals
,这意味着SrcFile
是对类的引用,而不是类的实例。将类似的变量放入
__init__
函数中,使其特定于实例:class SrcFile(object):
def __init__(self, which):
self.name = which
self.terminals = set([])