Xol*_*lve 61 python overloading missing-features
如上所述:
Python中没有函数重载.
据我所知,这也是一个很大的障碍,因为它也是一种OO语言.最初我发现无法区分参数类型很困难,但Python的动态特性使其变得容易(例如,列表,元组,字符串非常相似).
然而,计算传递的参数数量然后完成工作就像是一种矫枉过正.
var*_*tec 36
现在,除非您尝试使用Python语法编写C++代码,否则您需要重载什么?
我认为这恰恰相反,重载只是使强类型语言更像Python的必要条件.在Python中你有关键字参数,你有*args和**kwargs.
请参阅示例:在Python中使用多个构造函数的干净,pythonic方法是什么?
Rya*_*rom 33
正如unwind所述,具有默认值的关键字参数可以有很长的路要走.
我还要声明,在我看来,与许多类型传递给方法相比,它违背了Python的精神.在Python中,我认为使用duck typing更容易接受 - 询问对象可以做什么,而不是它是什么.
因此,如果您的方法可能接受字符串或元组,您可能会执行以下操作:
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
Run Code Online (Sandbox Code Playgroud)
然后你可以做以下任何一个:
print_names("Ryan Billy")
print_names(("Ryan", "Billy"))
Run Code Online (Sandbox Code Playgroud)
虽然这样的API有时表示设计问题.
Ste*_*ini 22
你不需要函数重载,因为你有*args和**kwargs参数.
事实是,函数重载是基于传递不同类型的想法,您将执行不同的代码.如果你有像python这样的动态类型语言,你不应该按类型区分,但是你应该处理接口及其对你编写的代码的遵从性.
例如,如果你有可以处理整数或整数列表的代码,你可以尝试迭代它,如果你不能,那么你假设它是一个整数并继续前进.当然它可能是一个浮点数,但就行为而言,如果float和int看起来是相同的,那么它们可以互换.
您可以将可变容器数据类型传递给函数,它可以包含您想要的任何内容.
如果您需要不同的功能,以不同的方式命名函数,或者如果U需要相同的接口,只需编写一个接口函数(或方法),根据接收的数据适当调用函数.
我花了一段时间来调整来自Java的这个,但它确实不是一个"大障碍"
| 归档时间: |
|
| 查看次数: |
101469 次 |
| 最近记录: |