繁体   English   中英

Python:将参数传递给__init__

[英]Python: passing arguments to __init__

我是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之外的所有参数传递参数。

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

方法唯一需要的参数是name ,并且必须是第一个参数。 之后,所有参数都具有默认值,使其成为可选值。 如果要覆盖默认值,请仅在以下位置传递该值:

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

另外,我是否建议使用有意义的名称或至少在您的方法中添加文档字符串 您可能还需要阅读Python样式指南

我相信您正在寻找字典解压缩:

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)

首先,您的代码有一个语法错误: Duplicate Argument iS in function defination 我用iS2替换了一个iS 因此,现在构造函数期望最多33个参数来初始化该类。

如您所说,除了默认值为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个参数的值将被重载。

我将使用以下功能作为示例,因为您的代码未按此处发布的方式运行:

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"
]

您可以通过切片来获得没有最后一个参数的相同列表:

>>> argument_values[:-1]
['value1', 'value2', 'value3', 'value4']

您可以获取此切片列表,并使用* 其解压缩为参数

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

当然,您需要粘贴最后一个参数,即argument_values[-1] 在这种情况下,只需使用关键字参数

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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM