python中的FileAndDirectory对象

2024-09-30 14:33:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在解析一个平面二进制文件,其中包含以特殊格式(带有标题、索引等)连接在一起的文件和(它们的)目录。在解析时,我想为它们中的每一个创建一个pythonfileanddirectory对象。FileAndDirectory对象的代码如下所示:

class FileAndDirectory(object):
    def __init__(self, name, path, children):
        self.name = name
        self.path = path
        self.children = []
        #children = children.append(LIFFile)
        self.isDirectory = True
        self.fileOffset = -1
        self.fileSize = -1

    def __init__(self, name, path, fileOffset, fileSize):
        children = []
        self.name = name
        self.isDirectory = False
        #self.children = children.append(LIFFile)
        self.fileOffset = fileOffset
        self.fileSize = fileSize
        self.path = path

    def toString():
        return self.name

因此,在解析文件时,我按如下方式创建它(这是可行的):

parsedFile = FileAndDirectory(name, fullPath, offsetInLIF, fileSize)

在解析我打算调用的目录时(但这不是):

folderContentsList.append(childFile)

 return FileAndDirectory(folderName, pathThusFar, folderContentsList)

我得到以下错误:

return FileAndDirectory(folderName, pathThusFar, folderContentsList)
TypeError: __init__() takes exactly 5 arguments (4 given)

在python中如何使用两个不同的签名调用对象?类似的代码将在JavaIMHO中工作


Tags: 文件path对象nameself目录returninit
2条回答

我必须说,我同情您的Java思维方式(因为我也是Python的初学者),但我一直对Python的优点感到惊讶,并因此尝试接受它们

幸运的是,在Python中,我们可以使用各种对象类型的元组。将其用作构造函数的参数,然后在构造函数内检查其长度:

def __init__(self, inputs):
    if len(inputs) == 3:
        # Parse a directory
    elif len(inputs) == 4:
        # Parse a file

与创建多个__init__方法不同(这在Python中不起作用,因为第二个方法“覆盖”了第一个方法),您有两个选项:

  1. 使用关键字参数:

    class FileAndDirectory(object):
        def __init__(self, name, path, children=None,
                     file_offset=None, file_size=None)
            ...
    

    问题在于,您需要记住,您正在创建的不同类型的东西需要哪一组输入

  2. 因此,第二种选择是拥有多个单独的构造函数,这些构造函数通常在Python中使用classmethods或staticmethods实现。它们通常包装普通构造函数。看起来是这样的:

    class FileAndDirectory(object):
        @classmethod
        def create_file(cls, name, full_path, file_offset, file_size):
            return cls(name, full_path, file_offset=file_offset,
                       file_size=file_size)
    
        @classmethod
        def create_directory(cls, name, full_path, children):
            return cls(name, full_path, children=children)
    

    然后,您将使用以下方法:

    FileAndDirectory.create_file(name, full_path, offset_in_LIF, file_size)
    FileAndDirectory.create_directory(folder_name, path_thus_far,
                                  folder_contents_list)
    

    作为解释-当您调用普通实例方法时self参数将成为正在被“从”调用的实例。调用classmethod时,cls参数是从中调用的类(如果存在子类,实际上可能是子类)。然后cls(...)调用执行与FileAndDirectory(...)相同的操作,即调用构造函数和初始值设定项。这段代码可能会让Java背景的人感到惊讶——it Python,类是运行时对象,可以像类的实例一样传递和使用

最后要考虑的是,如果您需要两个不同的构造函数,那么对我来说,为这些对象提供两个不同的类可能更可取。如果它们有一些相似之处,则可以从具有共享行为的基类继承。但你比我更清楚这一点

(注意-我“更正”了您的所有代码以使用PEP8变量名约定,这是Python中的标准,您也可以习惯它)

相关问题 更多 >