正如函数重载所说:
Python 中没有函数重载。
就我而言,这是一个很大的障碍,因为它也是一种面向对象(OO)的语言。最初我发现无法区分参数类型很困难,但是 Python 的动态特性使它变得容易(例如,列表、元组、字符串非常相似)。
但是,计算传递的参数数量然后执行这项工作就像是矫枉过正。
正如函数重载所说:
Python 中没有函数重载。
就我而言,这是一个很大的障碍,因为它也是一种面向对象(OO)的语言。最初我发现无法区分参数类型很困难,但是 Python 的动态特性使它变得容易(例如,列表、元组、字符串非常相似)。
但是,计算传递的参数数量然后执行这项工作就像是矫枉过正。
现在,除非您尝试使用 Python 语法编写 C++ 代码,否则您需要重载什么?
我认为恰恰相反。重载只是使强类型语言的行为更像 Python 所必需的。在 Python 中,您有关键字参数,并且有*args
and **kwargs
。
正如 unwind 所指出的,具有默认值的关键字参数可以走很长的路。
我还要声明,在我看来,过多地担心将哪些类型传递给方法,这违背了 Python 的精神。在 Python 中,我认为使用鸭子类型更容易接受——询问对象可以做什么,而不是它是什么。
因此,如果您的方法可以接受字符串或元组,您可以执行以下操作:
def print_names(names):
"""Takes a space-delimited string or an iterable"""
try:
for name in names.split(): # string case
print name
except AttributeError:
for name in names:
print name
然后您可以执行以下任一操作:
print_names("Ryan Billy")
print_names(("Ryan", "Billy"))
尽管这样的 API 有时表明存在设计问题。
您不需要函数重载,因为您有 *args 和 **kwargs 参数。
事实上,函数重载是基于传递不同类型将执行不同代码的想法。如果你有像 Python 这样的动态类型语言,你不应该按类型区分,但你应该处理接口及其与你编写的代码的一致性。
例如,如果您有可以处理整数或整数列表的代码,您可以尝试对其进行迭代,如果您不能,那么您假设它是一个整数并继续前进。当然它可以是一个浮点数,但就行为而言,如果浮点数和整数看起来相同,那么它们可以互换。
通常,您会看到建议使用带有默认值的关键字参数。调查一下。
您可以将可变容器数据类型传递给函数,它可以包含您想要的任何内容。
如果您需要不同的功能,请以不同的方式命名函数,或者如果您需要相同的接口,只需编写一个接口函数(或方法),根据接收到的数据适当地调用函数。
我花了一段时间来适应来自 Java 的这种情况,但这确实不是一个“大障碍”。