使用默认参数调用Python构造函数

使用默认参数调用Python构造函数,python,function,arguments,Python,Function,Arguments,假设您有一个Python类,其构造函数如下所示: def __init__(self,fname=None,data=[],imobj=None,height=0,width=0): 您希望创建它的一个实例,但只提供fname和imobj输入。正确的方法是 thing = Thing(f_name, None, im_obj, None, None) 或者有没有更好的方法打这个电话?您只需执行以下操作: thing = Thing(f_name=value1, im_obj=value2)

假设您有一个Python类,其构造函数如下所示:

 def __init__(self,fname=None,data=[],imobj=None,height=0,width=0):
您希望创建它的一个实例,但只提供fname和imobj输入。正确的方法是

thing = Thing(f_name, None, im_obj, None, None)
或者有没有更好的方法打这个电话?

您只需执行以下操作:

thing = Thing(f_name=value1, im_obj=value2)
请注意,在这种情况下,实际上不需要
f_name=
,因为
fname
是第一个参数(除了
self
,它是隐式传递的)。你可以这样做:

thing = Thing(value1, im_obj=value2)
但我个人认为第一种解决方案更具可读性。它清楚地表明,我们只更改了
f_name
im_obj
的值,而将所有其他参数保留为其默认值。此外,它使人们不想知道将分配给哪个参数
value1

此外,您几乎不希望将列表之类的可变对象作为默认参数。它将在函数的所有调用中共享。有关更多信息,请参见

,您只需执行以下操作即可:

thing = Thing(f_name=value1, im_obj=value2)
请注意,在这种情况下,实际上不需要
f_name=
,因为
fname
是第一个参数(除了
self
,它是隐式传递的)。你可以这样做:

thing = Thing(value1, im_obj=value2)
但我个人认为第一种解决方案更具可读性。它清楚地表明,我们只更改了
f_name
im_obj
的值,而将所有其他参数保留为其默认值。此外,它使人们不想知道将分配给哪个参数
value1


此外,您几乎不希望将列表之类的可变对象作为默认参数。它将在函数的所有调用中共享。有关详细信息,请参见您可以实例化的:

thing = Thing(f_name, imobj=im_obj)
其他命名参数将设置为默认值

您还可以将dict传递给构造函数:

>>> argDict={"fname": f_name, "imobj": im_obj}
>>> thing = Thing(**argDict)

这将解压dict值。请参阅。

您可以实例化:

thing = Thing(f_name, imobj=im_obj)
其他命名参数将设置为默认值

您还可以将dict传递给构造函数:

>>> argDict={"fname": f_name, "imobj": im_obj}
>>> thing = Thing(**argDict)

这将解压dict值。请参阅。

只需使用命名参数:“Thing(fname=f_name,imobj=im_obj)”,其他所有参数均为默认值。正如iCodez在下面所写,您不希望将该
data=[]
作为默认参数。您需要的是
data=None
,然后在
\uuuu init\uuuu
的主体中,如果数据为None,您可以编写
:self.data=[]
或您计划对其执行的任何操作。只需使用命名参数:“Thing(fname=f\u name,imobj=im\u obj)”,其他所有内容都是默认值。您不希望将该
data=[]
作为默认参数,正如iCodez在下面写到的。您需要的是
data=None
,然后在
\uuuu init\uuuu
的主体中,如果数据为None,您可以编写
:self.data=[]
或您计划对其执行的任何操作。您不应该将列表之类的可变对象作为默认参数-不一定永远-但99%的时间,它肯定不是你想要的,而且会咬你。在这里,我用了“几乎从来没有”。-)您永远不应该将列表之类的可变对象作为默认参数-不一定不-但99%的时候,它肯定不是您想要的,并且会咬到您。在这里,我使用了“几乎从不”。-)