为什么在Python中跨类继承属性?

为什么在Python中跨类继承属性?,python,class,attributes,Python,Class,Attributes,显然,我在学习如何正确使用课堂上遇到了一些困难。我希望下面的代码循环遍历一组文件(确实如此),在一个集合中添加元素(确实如此),并在它移动到一个新文件时启动该集合(它不这样做)。按照我破解下面代码的方式,我希望它每次为file.terminals返回一个空集,因为我相信每个集合都是类SrcFile的新实例的唯一属性。显然,我错了。实际发生的情况是,第一个文件创建的终端集对于列表中的所有后续文件都会保留(并添加到),尽管其他属性(例如,file.name,file.seqlength())会随文件

显然,我在学习如何正确使用课堂上遇到了一些困难。我希望下面的代码循环遍历一组文件(确实如此),在一个集合中添加元素(确实如此),并在它移动到一个新文件时启动该集合(它不这样做)。按照我破解下面代码的方式,我希望它每次为
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=set([])
,在定义类时创建一次,而不是在创建实例时创建一次

要避免这种情况,请将其删除并将以下内容添加到
\uuuu init\uuu
方法中:

self.terminals = set()

您是在类声明中定义
终端
,而不是在为类的每个新实例执行的
\uuu init\uuuu
函数中

基本上,
终端
针对整个类进行初始化,而不是针对类的每个实例:

>>> SrcFile.terminals
set([])
注意,我运行了
SrcFile.terminals
,而不是
SrcFile().terminals
,这意味着
SrcFile
是类的引用,而不是类的实例

您可以在
\uuuu init\uuuu
函数中放置类似的变量,使其特定于实例:

class SrcFile(object):
  def __init__(self, which):
    self.name = which
    self.terminals = set([])

谢谢这就解决了问题。我真的很感谢这个论坛对我们这些刚刚开始的人的耐心。明白了…有很多东西要学。接受提交的第一个正确答案并签字。重定向到此处