2012-03-27 68 views
4

我有一个我想实例化的python类,并且__init__定义有很多参数(10+)。是否有一个干净的方式来实例化一个类,它的__init__需要大量的参数?在Python中实例化对象

例如:

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有这么多参数? – 2012-03-27 19:38:23

+1

我真的希望你的参数不是这样命名的! – ThiefMaster 2012-03-27 19:45:21

回答

6

是的,你可以使用一个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教程的unpacking argument lists部分。

此外,//不是在Python中的评论,它是地板部门。 #是一条评论。对于多行评论,'''You can use triple single quotes'''"""triple double quotes"""

3

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

您可以通过前缀的字典,**,例如指定使用字典关键字参数:

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

my_a = A(**options) 

如果你要来一次定义所有的值,使用字典不真正给你任何优势只是指定它们直接在使用额外的空格为clairity:

my_a = A(
    param1 = "foo", 
    param2 = "bar", 
    param3 = "baz" 
) 
+1

你不应该把它叫做'args',Python中的约定是'args'是位置参数列表,而不是'dict'。 – agf 2012-03-27 19:41:53

+0

@agf感谢您的建议。我改变了它。 – 2012-03-27 19:42:27

+0

关于一次定义它们 - 如果你要在多个地方使用相同的参数,那么如果你使用了'dict',你只需要在代码中使用它们。 – agf 2012-03-27 19:57:27

1

一般来说,具有许多参数往往是一个迹象,表明一类是太复杂了,应该分开。

如果不适用,请传递字典或特殊参数对象。

3

它不好将一些参数传递给构造函数。但如果你想这样做,请尝试:

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)