可能重复:
难道不能在 Python 中定义多个具有不同签名的构造函数吗?如果不是,绕过它的一般方法是什么?
例如,假设您想定义一个类 City
。
我希望能够说 someCity = City()
或 someCity = City("Berlin")
,其中第一个只给出默认名称值,第二个定义它。
原文由 Chris 发布,翻译遵循 CC BY-SA 4.0 许可协议
可能重复:
难道不能在 Python 中定义多个具有不同签名的构造函数吗?如果不是,绕过它的一般方法是什么?
例如,假设您想定义一个类 City
。
我希望能够说 someCity = City()
或 someCity = City("Berlin")
,其中第一个只给出默认名称值,第二个定义它。
原文由 Chris 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您的签名仅在参数 数量 上有所不同,那么使用默认参数是正确的方法。如果您希望能够传递不同 类型 的参数,我会尽量避免另一个答案中提到的基于 isinstance
的方法,而是使用关键字参数。
如果仅使用关键字参数变得笨拙,您可以将其与类方法结合使用(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 或…返回的对象)。通常一个更好的主意是让调用者通过使用不同的关键字参数明确地告诉您意味着什么类型的对象。
原文由 mzz 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
与 Java 不同,您不能定义多个构造函数。但是,如果未通过,您可以定义一个默认值。