<p>与创建多个<code>__init__</code>方法不同(这在Python中不起作用,因为第二个方法“覆盖”了第一个方法),您有两个选项:</p>
<ol>
<li><p>使用关键字参数:</p>
<pre><code>class FileAndDirectory(object):
def __init__(self, name, path, children=None,
file_offset=None, file_size=None)
...
</code></pre>
<p>问题在于,您需要记住,您正在创建的不同类型的东西需要哪一组输入</p></li>
<li><p>因此,第二种选择是拥有多个单独的构造函数,这些构造函数通常在Python中使用classmethods或staticmethods实现。它们通常包装普通构造函数。看起来是这样的:</p>
<pre><code>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)
</code></pre>
<p>然后,您将使用以下方法:</p>
<pre><code>FileAndDirectory.create_file(name, full_path, offset_in_LIF, file_size)
FileAndDirectory.create_directory(folder_name, path_thus_far,
folder_contents_list)
</code></pre>
<p>作为解释-当您调用普通实例方法时<code>self</code>参数将成为正在被“从”调用的实例。调用classmethod时,<code>cls</code>参数是从中调用的类(如果存在子类,实际上可能是子类)。然后<code>cls(...)</code>调用执行与<code>FileAndDirectory(...)</code>相同的操作,即调用构造函数和初始值设定项。这段代码可能会让Java背景的人感到惊讶——it Python,类是运行时对象,可以像类的实例一样传递和使用</p></li>
</ol>
<p>最后要考虑的是,如果您需要两个不同的构造函数,那么对我来说,为这些对象提供两个不同的类可能更可取。如果它们有一些相似之处,则可以从具有共享行为的基类继承。但你比我更清楚这一点</p>
<p>(注意-我“更正”了您的所有代码以使用PEP8变量名约定,这是Python中的标准,您也可以习惯它)</p>