3

クラスを正しく使用する方法を学ぶのに苦労しているようです。次のコードが一連のファイルをループし (実行する)、要素をセットに追加し (実行する)、新しいファイルに移動したときにセットを最初からやり直す (実行しない) ことを期待しています。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())
4

2 に答える 2

4

クラスの新しいインスタンスごとに実行される関数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([])
于 2012-06-19T23:57:38.293 に答える
3

terminals = set([])クラス自体で定義することにより、インスタンスが作成されるときではなく、クラスが定義されるときに一度作成されます。

これを回避するには、それを削除して、__init__メソッドに次を追加します。

self.terminals = set()
于 2012-06-19T23:55:26.390 に答える