2013-05-27 17 views
0

我对Python的学习曲线很不满意,我认为缺少关于类实例化的基本知识。在我的代码中,我有一个简单的类,它包含我想在递归搜索期间保存在列表中的文件和目录的格式。文件名与类中的目录名分开保存,我有两个实例。其中之一,我正在寻找其中包含“RFI”文本的文件和目录,另一个我正在寻找“CCO”。运行后,打印语句显示两个实例中的所有匹配,而不是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) 

下面是从最后一次打印声明,显示这两种情况下相同的值输出:

------- 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'] 

回答

1

这是因为titlenameFormats等都是静态的。这些对象在文档的所有实例之间共享。如果你想让每个实例都有自己的列表,然后在构造函数中创建它们:

class Docs : 
    def __init__ (self, inTitle, inFormats): 
     self.title = inTitle 
     self.nameFormats = inFormats 
     self.title = [] 
     self.nameFormats = [] 
     self.fileMatches = [] 
     self.dirMatches = [] 
+0

啊。这工作。非常感谢。我做的唯一的调整是“self.title”和“self.nameFormats”在示例代码中定义了两次。这是一个错字还是我错过了什么? – buttonsrtoys