2016-06-13 42 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