我对Python学习曲线很缺乏,我认为缺少关于类实例化的基本知识。在下面的代码中,我有一个简单的类,其中包含我想在递归搜索期间保存在列表中的文件和目录的格式。文件名与类中的目录名分开保存,我有两个实例。在一个方面,我正在寻找文本和目录,其中包含文本“RFI”,另一个我正在寻找“CCO”。运行后,print语句显示两个实例中的所有匹配项,而不是RFI实例中的RFI匹配项以及CCO实例中的CCO匹配项。这就像“fileMatches”和“dirMatches”表现为静态变量(如果我正确地得到了我的术语),那么附加到一个实例的列表会附加到两者上吗?
import fnmatch
import os
path = '.'
allDocs = []
class Docs :
title = []
nameFormats = []
fileMatches = []
dirMatches = []
def __init__ (self, inTitle, inFormats):
self.title = inTitle
self.nameFormats = inFormats
allDocs.append(Docs('RFI','RFI*[0-999]*'))
allDocs.append(Docs('CCO','CCO*[0-999]*'))
for root, dirnames, filenames in os.walk(path):
print ("Root: " + root)
for currDoc in allDocs :
for currDirname in fnmatch.filter(dirnames, currDoc.nameFormats):
currDoc.dirMatches.append(currDirname)
for currFilename in fnmatch.filter(filenames, currDoc.nameFormats):
currDoc.fileMatches.append(currFilename)
print ("------- Results ----------")
for currDoc in allDocs :
print (currDoc.title, currDoc.nameFormats, "directory matches: ", currDoc.dirMatches)
print (currDoc.title, currDoc.nameFormats, " file matches: ", currDoc.fileMatches)
下面是最后一个print语句的输出,它显示了两个实例的相同值:
------- Results ----------
RFI RFI*[0-999]* directory matches: ['RFI#04 Blah']
RFI RFI*[0-999]* file matches: ['CCO#02 Blah.pdf', 'CCO#01 Blah.pdf', 'RFI #1.pdf', 'RFI #2.pdf', 'RFI #3.pdf']
CCO CCO*[0-999]* directory matches: ['RFI#04 Blah']
CCO CCO*[0-999]* file matches: ['CCO#02 Blah.pdf', 'CCO#01 Blah.pdf', 'RFI #1.pdf', 'RFI #2.pdf', 'RFI #3.pdf']
答案 0 :(得分:1)
这是因为title
,nameFormats
等是静态的。这些对象在Docs的所有实例之间共享。如果您希望每个实例都有自己的列表,那么在构造函数中创建它们:
class Docs :
def __init__ (self, inTitle, inFormats):
self.title = inTitle
self.nameFormats = inFormats
self.title = []
self.nameFormats = []
self.fileMatches = []
self.dirMatches = []