2012-03-27 4 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には非常に多くのパラメータがありますか? –

+1

私は本当にあなたのparamsが本当にこのような名前ではないことを願っています! – ThiefMaster

答えて

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

+0

@agf提案していただきありがとうございます。私はそれを変更しました。 –

+0

これらを一度にすべて定義することについては、複数の場所で同じパラメータを使用する場合は、 'dict'を使用すればコード内に1回だけ置く必要があります。 – agf

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) 
関連する問題