很明显我在学习如何正确使用课堂上遇到了一些困难。我希望下面的代码循环遍历一组文件(确实如此),在一个集合中添加元素(确实如此),并在该集合移动到新文件时重新启动它(确实如此)。按照我破解下面代码的方式,我希望它每次为file.terminals返回一个空集合,因为我相信每个集合都是类SrcFile的新实例的唯一属性。显然,我错了。实际发生的情况是,由第一个文件创建的终端集会为列表中的所有后续文件保留(并添加到中),尽管其他属性(例如file.namefile.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([])

10-07 17:32