2016-06-13 1 views
1

私は、クラスメソッドは、Pythonでinitメソッドを "オーバーロード"するために使用できることを知っていますが、私は少し問題に遭遇しています。例えば、私はこのようなコンストラクタを持っている、と言う:pythonでコンストラクタをオーバーロードする方がいいですか?

def __init__(self, serviceName, endpoint, exportedInterface, exportedObject, remoteObjectInterface, remoteObjectProxy, 
       interruptionHandler, invalidationHandler): 

    self._serviceName = serviceName; 
    #etc. 

@classmethod 
def createConnection(cls, serviceName): 
    return cls(serviceName, None, None, None, None, None, None, None) 

が、私は本当にただのクラスメソッドを持つクラスのインスタンスを作成するには、クラスメソッド内のすべての単一のデータメンバの値をリストアップする必要がありますか?また、後でクラスにデータメンバーを追加する予定ですが、このように扱いにくいinit関数を15個の引数で持たせるのは嬉しいことではありません。これについてもっと良い方法がありますか?

答えて

6

パラメータにはデフォルト値を使用できます。次に、置き換えるものを指定することができます。

def __init__(self, serviceName, endpoint = None, exportedInterface = None, 
      exportedObject = None, remoteObjectInterface = None, remoteObjectProxy = None, 
      interruptionHandler = None, invalidationHandler = None): 

    self._serviceName = serviceName; 
    #etc. 

@classmethod 
def createConnection(cls, serviceName): 
    return cls(serviceName) 

今、あなたはこのようなだけでいくつかの引数を(他はデフォルト値を使用します)を設定することができます

@classmethod 
def createConnectionWithInterruptionHandler(cls, serviceName, interruptionHandler): 
    return cls(serviceName, interruptionHandler=interruptionHandler) 
+0

感謝を行うために必要最小限と使用工場の機能を実行してください!これは役に立ちます:) –

0

二つのオプションは以下のとおりです。

使用キーワード引数。例えば

def __init__(self, **kwargs): 
    for names in ("serviceName", ...): 
     setattr(self, "_" + name, kwargs.get(names, None)) 

__init__は、適切な初期化に

def __init__(self): pass 

@classmethod 
def createConnection(cls, serviceName): 
    foo = cls() 
    foo._serviceName = serviceName 
    return foo 
+0

なぜ 'self [" _ "+ name] = kwargs.get(names)'の代わりに '__setitem__'を直接使用していますか?あるいは代わりに 'setattr'を使うことを意味しますか? –

+0

@ Tadhg:はい、私は 'setattr'を意味しました – Hurkyl

関連する問題