[英]Why is attribute being inherited across classes in Python?
我顯然在學習如何正確使用類方面遇到一些麻煩。 我期望以下代碼循環遍歷一組文件(確實如此),向其添加元素(確實如此),並在將其移至新文件時重新開始( 不會 )。 我以下面的代碼file.terminals
,我希望它每次都會為file.terminals
返回一個空集,因為我相信每個集都是SrcFile
類新實例的唯一屬性。 顯然,我錯了。 實際發生的是,盡管其他屬性(例如file.name
, file.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.