2016-06-13 82 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) 

難道我真的要列出在類方法的每一個數據成員的值,它只是一個與類方法創建類的實例?另外,我打算在後面添加更多的數據成員,但我不喜歡用15個參數來執行這個笨拙的init函數。有沒有更好的方法來解決這個問題?

回答

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

爲什麼你直接使用'__setitem__'而不是'self [「_」+ name] = kwargs.get(names)'?或者,你可能是想用'setattr'來代替? –

+0

@Tadhg:是的,我的意思是'setattr' – Hurkyl