在python中重载构造函数的更好方法?

时间:2016-06-13 19:03:01

标签: python

所以我知道类方法可以用来超载" python中的init方法,但我遇到了一些问题。比方说,我有一个像这样的构造函数:

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个参数来拥有这个难以处理的初始化函数。有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

有两个选项:

使用关键字参数。 e.g。

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