Python:将参数传递给__init__

时间:2014-01-30 23:44:20

标签: python

我是python的新手,并拥有以下 init

def __init__(self, name, iMD=False, iI=False, o=0, o1=0, o2=0,
                 t=QUIC, mF=QUIC_KW, pM=0, pD=0, nF=0, pA=0, iS=0, iPA=1, h='',
                 iRC='', sC='', iM=0, iS=0, pAIR=0, 
                 pAII=0, cM='', k=0.0, t=0.0, m=0.0, mi=0.0, av=0.0, mL=0.0,
                 mD=None, iD=None, cCI=None, cCSEI=None, rfI = 0)

基本上,当我创建这个对象时,我想传递所有参数,除了那些默认值为None的参数。

Python中有解决方法吗?我也不想移动参数的顺序,因为有很多遗留代码。

编辑:只是为了澄清。是的,有默认值,但是,我正在使用从数据库读入的非默认值创建此对象。基本上我需要传递除mD,iD,cCI和cCSEI之外的所有参数的参数。

我希望我能像这样构建一个新对象: 对象(arg1,arg2,arg3,arg4,arg5,arg6,arg7,...,arg27 ,,,,,, arg28)

4 个答案:

答案 0 :(得分:4)

您的方法唯一必需的参数是name,它必须是第一个参数。之后,所有参数都有默认值,使它们成为可选参数。如果要覆盖默认值,只需传递该值:

foo = SomeClass('hello', rfI=10)

此外,我可以建议您使用有意义的名称或至少为您的方法添加docstring。您可能还想阅读Python style guide

答案 1 :(得分:1)

我相信你正在寻找字典解包:

class MyObj(object):
  def __init__(self, name, iMD=False, iI=False, o=0, o1=0, o2=0,
             t=QUIC, mF=QUIC_KW, pM=0, pD=0, nF=0, pA=0, iS=0, iPA=1, h='',
             iRC='', sC='', iM=0, iS=0, pAIR=0, 
             pAII=0, cM='', k=0.0, t=0.0, m=0.0, mi=0.0, av=0.0, mL=0.0,
             mD=None, iD=None, cCI=None, cCSEI=None, rfI = 0)

myArgs = {'rfI': 11}
m = MyObj('myname', **myArgs)
// m now has 'myname' as a name, rfI=11 and everything else as default

请注意,这与说:

完全相同
m = MyObj('myname', rfI=11)

答案 2 :(得分:0)

首先,您的代码有一个语法错误:Duplicate Argument iS in function defination。我用iS替换了一个iS2。所以现在构造函数最多需要33个Arguments来初始化类。

正如您所说,您不希望将值传递给除默认值为None之外的所有值。只需简单地将27个值传递给构造函数

class foo():
    def __init__(self, name, iMD=False, iI=False, o=0, o1=0, o2=0,
                 t=QUIC, mF=QUIC_KW, pM=0, pD=0, nF=0, pA=0, iS=0, iPA=1, h='',
                 iRC='', sC='', iM=0, iS2=0, pAIR=0, 
                 pAII=0, cM='', k=0.0, t2=0.0, m=0.0, mi=0.0, av=0.0, mL=0.0,
                 mD=None, iD=None, cCI=None, cCSEI=None, rfI = 0):
        print name, iMD


myObj = foo(val1, val2, val3, val4, val5, val6, val7, val8, val9, val10,
    val11, val12, val13, val14, val15, val16, val17, val18, val19, val20,
    val21, val22, val23, val24, val25, val26, val27, val28)

前27个参数的值将被重载。

答案 3 :(得分:0)

我将使用下面的函数作为示例,因为您的代码不会像在此处发布的那样运行:

def func(name, arg1=0, arg2=0, arg3=0, arg4=0, argSkip=None, arg6=0):
    print arg1, arg2, arg3, arg4, argSkip, arg6

参数的值应该从这个列表中传递出来:

argument_values = [
    "value1", "value2", "value3", "value4", "value... SURPRISE! VALUE6"
]

使用slicing

,您可以获得相同的列表,而不使用最后一个参数
>>> argument_values[:-1]
['value1', 'value2', 'value3', 'value4']

您可以使用*

获取此切片列表和unpack it as the arguments
func('some name here', *argument_values[:-1])

当然,您需要传递最后一个参数,即argument_values[-1]。在这种情况下,只需使用keyword arguments

func('some name here', *argument_values[:-1], arg6=argument_values[-1])

这是完整的脚本:

def func(name, arg1=0, arg2=0, arg3=0, arg4=0, argSkip=None, arg6=0):
    print arg1, arg2, arg3, arg4, argSkip, arg6

argument_values = [
    "value1", "value2", "value3", "value4", "value... SURPRISE! VALUE6"
]

func('some name here', *argument_values[:-1], arg6=argument_values[-1])