我是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)
答案 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']
您可以使用*
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])