Class 创建类实例并附加到列表

Class 创建类实例并附加到列表,class,python-3.x,Class,Python 3.x,我在Python学习方面处于劣势,我认为缺少一些关于类实例化的基本知识。在下面的代码中,我有一个简单的类,其中包含了在递归搜索期间要保存在列表中的文件和目录的格式。文件名与类中的目录名分开保存,我有两个实例。在其中一个例子中,我在寻找包含文本“RFI”的文件和目录,而另一个例子中,我在寻找“CCO”。运行后,print语句将显示两个实例中的所有匹配,而不是RFI实例中的RFI匹配和CCO实例中的CCO匹配。这就像“fileMatches”和“dirMatches”是作为静态变量运行的(如果我正确

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

这是因为
标题
名称格式
等是静态的。这些对象在所有文档实例之间共享。如果希望每个实例都有自己的列表,请在构造函数中创建它们:

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

这是因为
标题
名称格式
等是静态的。这些对象在所有文档实例之间共享。如果希望每个实例都有自己的列表,请在构造函数中创建它们:

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

啊。成功了。非常感谢。我所做的唯一调整是“self.title”和“self.nameFormats”在示例代码中定义了两次。那是打字错误还是我遗漏了什么?啊。成功了。非常感谢。我所做的唯一调整是“self.title”和“self.nameFormats”在示例代码中定义了两次。那是打字错误还是我遗漏了什么?