Function overloading in Python: Missing
他说:这
web.archive.org http:/ / / / / 20090624083829网站http://mail.python.org pipermail Python列表/ / / / 206149.html 2003年5月
在Python函数重载是缺席。
只要我觉得这一大障碍,因为它是面向对象的语言。最初我发现无法differentiate实参类型之间没有什么不自然的Python动态制造轻松(例如列表、元组,字符串是多相似)。
然而数计数的参数传递,然后像做工作是必要的。
现在,除非您试图用Python语法编写C++代码,否则您需要重载什么?
我认为恰恰相反,重载只是使强类型语言更像Python所必需的。在python中,有关键字参数,有
例如,请参见:在python中使用多个构造函数的一种干净的python方法是什么?
正如unwind所指出的,具有默认值的关键字参数可能会有很长的路要走。
我还将声明,在我看来,非常担心什么类型被传递到方法中违背了Python的精神。在Python中,我认为使用duck类型更为普遍——询问对象可以做什么,而不是问它是什么。
因此,如果您的方法可以接受一个字符串或元组,您可以这样做:
1 2 3 4 5 6 7 8 | 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 |
然后你可以这样做:
1 2 | print_names("Ryan Billy") print_names(("Ryan","Billy")) |
尽管这样的API有时表示存在设计问题。
您不需要函数重载,因为您有*args和**kwargs参数。
事实上,函数重载是基于这样一种思想:传递不同的类型,您将执行不同的代码。如果您有一种动态类型语言(如python),那么您不应该根据类型来区分,而是应该处理接口及其与您编写的代码的一致性。
例如,如果您有可以处理整数或整数列表的代码,则可以尝试对其进行迭代,如果无法进行迭代,则假定它是整数并继续。当然,它可以是一个浮点,但是就行为而言,如果一个浮点和一个int看起来是相同的,那么它们可以互换。
您可以将可变容器数据类型传递给函数,它可以包含您想要的任何内容。
如果您需要不同的功能,请对函数进行不同的命名,或者如果您需要相同的接口,只需编写一个接口函数(或方法),根据接收到的数据适当地调用函数。
我花了一段时间才适应了来自Java的这一点,但它并不是一个"大障碍"。
通常,您会看到建议使用带有默认值的关键字参数。看看那个。