在Python中实例化对象

7

我有一个Python类需要实例化,其中__init__定义了许多参数(10个以上)。有没有一种简洁的方法来实例化需要许多参数的类?

例如:

class A(object):

    def __init__(self, param1, param2, param3,...param13):
    // create an instance of A


my_a = new A(param1="foo", param2="bar", param3="hello"....)

有没有更简洁的方法来实现这个?比如传入一个字典之类的东西?或者更好的,有没有一种预期的约定?

3
为什么init函数有很多参数? - Tyler Eaves
1
我真的希望你的参数不是这样命名的! - ThiefMaster
4个回答

9

是的,你可以使用 dict 来收集参数:

class A(object):
    def __init__(self, param1, param2, param3):
        print param1, param2, param3


params = {'param1': "foo", 'param2': "bar", 'param3': "hello"}
# no 'new' here, just call the class
my_a = A(**params)

请参见Python教程中的解包参数列表部分。

此外,//在Python中不是注释,而是地板除法。 # 是注释符号。对于多行注释,请使用'''您可以使用三个单引号'''"""三个双引号"""


6

Python中没有 new 关键字。您只需像调用函数一样调用类名即可。

您可以通过在字典前缀加上** 来指定关键字参数,例如:

options = {
    "param1": "foo",
    "param2": "bar",
    "param3": "baz"
}

my_a = A(**options)

如果你打算一次性定义所有的值,使用字典并没有比直接指定这些值带来什么优势,只需使用额外的空白符以提高可读性即可。
my_a = A(
    param1 = "foo",
    param2 = "bar",
    param3 = "baz"
)

1
你不应该把它称为 args,在 Python 中的惯例是 args 是一个位置参数列表,而不是一个字典。 - agf
关于一次性定义它们 - 如果您要在多个地方使用相同的参数,如果使用dict,只需在代码中一次定义即可。 - agf

4

向构造函数传递过多的参数不是一个好习惯。但如果您确实需要这样做,请尝试以下方法:

class A(object):
    def __init__(self, *args,**kwargs):
        """
        provide list of parameters and documentation
        """
        print *args, **kwargs
params = {'param1': "foo", 'param2': "bar", 'param3': "hello"}
a = A(**params)

1
通常,拥有那么多参数往往意味着一个类过于复杂,应该拆分成几个类。
如果这不适用,可以传递一个字典或特殊的参数对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接