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) if
– elif
块的types为:
def __init__(self, name): if isinstance(name, str): ... elif isinstance(name, City): ... ...
2)使用鸭子打字 – 也就是说,假设你的class级的用户足够聪明,可以正确使用它。 这通常是首选的select。