我正在解析一个平面二进制文件,其中包含以特殊格式(带有标题、索引等)连接在一起的文件和(它们的)目录。在解析时,我想为它们中的每一个创建一个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中工作
我必须说,我同情您的Java思维方式(因为我也是Python的初学者),但我一直对Python的优点感到惊讶,并因此尝试接受它们
幸运的是,在Python中,我们可以使用各种对象类型的元组。将其用作构造函数的参数,然后在构造函数内检查其长度:
与创建多个
__init__
方法不同(这在Python中不起作用,因为第二个方法“覆盖”了第一个方法),您有两个选项:使用关键字参数:
问题在于,您需要记住,您正在创建的不同类型的东西需要哪一组输入
因此,第二种选择是拥有多个单独的构造函数,这些构造函数通常在Python中使用classmethods或staticmethods实现。它们通常包装普通构造函数。看起来是这样的:
然后,您将使用以下方法:
作为解释-当您调用普通实例方法时
self
参数将成为正在被“从”调用的实例。调用classmethod时,cls
参数是从中调用的类(如果存在子类,实际上可能是子类)。然后cls(...)
调用执行与FileAndDirectory(...)
相同的操作,即调用构造函数和初始值设定项。这段代码可能会让Java背景的人感到惊讶——it Python,类是运行时对象,可以像类的实例一样传递和使用最后要考虑的是,如果您需要两个不同的构造函数,那么对我来说,为这些对象提供两个不同的类可能更可取。如果它们有一些相似之处,则可以从具有共享行为的基类继承。但你比我更清楚这一点
(注意-我“更正”了您的所有代码以使用PEP8变量名约定,这是Python中的标准,您也可以习惯它)
相关问题 更多 >
编程相关推荐