在Python中不能用不同的签名定义多个构造函数吗?如果没有,一般有什么方法可以绕过它呢?
例如,假设您想要定义一个类City。
我希望能够说someCity = City()或someCity = City("Berlin"),其中第一个只给出一个缺省名称值,而第二个定义它。
发布于 2010-01-29 18:41:42
与Java不同,您不能定义多个构造函数。但是,如果未传递默认值,则可以定义默认值。
def __init__(self, city="Berlin"):
self.city = city发布于 2010-01-29 18:57:12
如果您的签名仅在参数数量上有所不同,则使用默认参数是正确的方法。如果您希望能够传递不同类型的参数,我将尽量避免使用另一个答案中提到的isinstance-based方法,而是使用关键字参数。
如果使用just关键字参数变得不方便,可以将其与classmethods组合( bzrlib代码喜欢这种方法)。这只是一个愚蠢的例子,但我希望你明白这个想法:
class C(object):
def __init__(self, fd):
# Assume fd is a file-like object.
self.fd = fd
@classmethod
def from_filename(cls, name):
return cls(open(name, 'rb'))
# Now you can do:
c = C(fd)
# or:
c = C.from_filename('a filename')注意,所有这些类方法仍然要经过相同的__init__,但是使用类方法可能比记住__init__的关键字参数组合更方便。
最好避免使用isinstance,因为Python的鸭子类型使得很难确定到底传入了什么类型的对象。例如:如果您想使用文件名或类似文件的对象,则不能使用isinstance(arg, file),因为有许多类文件对象不是file子类(例如从urllib或StringIO返回的对象,或.)。通过使用不同的关键字参数,让调用方明确地告诉您对象的含义通常是一个更好的主意。
发布于 2010-01-29 18:40:58
对于您提供的示例,请使用默认值:
class City:
def __init__(self, name="Default City Name"):
...
...一般来说,您有两种选择:
if-elif块:
def __init__(self,name):if isinstance(name,str):# todo elif isinstance(name,City):# todo # todo #todohttps://stackoverflow.com/questions/2164258
复制相似问题