Python中有多个构造函数?

可能重复:
Python中有多个构造函数的干净,pythonic方法是什么?

是不是可以在Python中定义多个构造函数,具有不同的签名? 如果不是,绕过它的一般方法是什么?

例如,假设您想定义一个类City

我希望能够说someCity = City()someCity = City("Berlin") ,其中第一个只是默认的名称值,第二个定义它。

不像Java,你不能定义多个构造函数。 但是,如果没有传递,您可以定义一个默认值。

 def __init__(self, city="Berlin"): self.city = city 

如果你的签名只在使用默认参数的参数个数上有所不同,那么这是正确的。 如果你想能够通过不同types的参数,我会尽量避免在另一个答案中提到的基于isinstance的方法,而不是使用关键字参数。 如果只使用关键字参数变得笨拙,你可以把它和classmethods结合起来(bzrlib代码喜欢这种方法)。 这只是一个愚蠢的例子,但我希望你明白:

 class C(object): def __init__(self, fd): # Assume fd is a file-like object. self.fd = fd @classmethod def fromfilename(cls, name): return cls(open(name, 'rb')) # Now you can do: c = C(fd) # or: c = C.fromfilename('a filename') 

注意,所有这些类方法仍然通过相同的__init__ ,但是使用类方法比记得__init__的关键字参数的组合方式更方便。

isinstance是最好的避免,因为python的鸭子打字很难弄清楚什么样的对象实际通过。例如:如果你想采取一个文件名或类似文件的对象,你不能使用isinstance(arg, file)因为有许多文件类对象没有子类file (如从urllib,或StringIO,或…返回的)。 通过使用不同的关键字参数,让调用者明确地告诉你什么types的对象是一个更好的主意。

最简单的方法是通过关键字参数:

 class City(): def __init__(self, city=None): pass someCity = City(city="Berlin") 

这是非常基本的东西,也许看看python文档 ?

杰克M.是对的,这样做:

 >>> class City: ... def __init__(self, city=None): ... self.city = city ... def __repr__(self): ... if self.city: return self.city ... return '' ... >>> c = City('Berlin') >>> print c Berlin >>> c = City() >>> print c >>> 

对于你给的例子,使用默认值:

 class City: def __init__(self, name="Default City Name"): ... ... 

一般来说,你有两个select:

1) ifelif块的types为:

 def __init__(self, name): if isinstance(name, str): ... elif isinstance(name, City): ... ... 

2)使用鸭子打字 – 也就是说,假设你的class级的用户足够聪明,可以正确使用它。 这通常是首选的select。