簡體   English   中英

為什么在Python中跨類繼承屬性?

[英]Why is attribute being inherited across classes in Python?

我顯然在學習如何正確使用類方面遇到一些麻煩。 我期望以下代碼循環遍歷一組文件(確實如此),向其添加元素(確實如此),並在將其移至新文件時重新開始( 不會 )。 我以下面的代碼file.terminals ,我希望它每次都會為file.terminals返回一個空集,因為我相信每個集都是SrcFile類新實例的唯一屬性。 顯然,我錯了。 實際發生的是,盡管其他屬性(例如file.namefile.seqlength() )隨文件而適當地變化,但由第一個文件創建的終端組對於列表中的所有后續文件都保持file.name (並添加到其中)。 有人可以解釋一下為什么這種方式起作用以及我如何創建期望的行為嗎? 預先感謝您耐心等待剛開始的程序員的無知。

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

基本上, terminals是針對整個類而不是針對該類的每個實例初始化的:

>>> SrcFile.terminals
set([])

注意,我運行的是SrcFile.terminals ,而不是SrcFile().terminals ,這意味着SrcFile是對該類的引用,而不是該類的實例。

您可以將類似的變量放在__init__函數內部,以使它們特定於實例:

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

通過在類本身中定義terminals = set([]) ,在定義類時就創建一次 ,而在創建實例時就不會創建。

為了避免這種情況,請將其刪除並將以下內容添加到您的__init__方法中:

self.terminals = set()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM