Python 中的重载函数

2025-03-13 09:15:00
admin
原创
12
摘要:问题描述:Python 中可以有重载函数吗?在 C# 中我会做类似的事情void myfunction (int first, string second) { # Some code } void myfunction (int first, string second, float third)...

问题描述:

Python 中可以有重载函数吗?

在 C# 中我会做类似的事情

void myfunction (int first, string second)
{
    # Some code
}

void myfunction (int first, string second, float third)
{
    # Some different code
}

然后当我调用该函数时,它会根据参数的数量区分两者。在 Python 中可以做类似的事情吗?


解决方案 1:

编辑有关 Python 3.4 中的新单调度通用函数,请参阅http://www.python.org/dev/peps/pep-0443/

通常不需要在 Python 中重载函数。Python 是动态类型的,并且支持函数的可选参数。

def myfunction(first, second, third = None):
    if third is None:
        #just use first and second
    else:
        #use all three

myfunction(1, 2) # third will be None, so enter the 'if' clause
myfunction(3, 4, 5) # third isn't None, it's 5, so enter the 'else' clause

解决方案 2:

在普通的 Python 中,你无法做你想做的事。有两种近似方法:

def myfunction(first, second, *args):
    # 'args' is a tuple of extra arguments

def myfunction(first, second, third=None):
    # 'third' is optional

但是,如果你真的想这样做,你当然可以让它发挥作用(冒着冒犯传统主义者的风险 ;o)。简而言之,你可以编写一个wrapper(*args)函数来检查参数的数量并根据需要委托。这种“黑客”通常是通过装饰器完成的。在这种情况下,你可以实现类似以下效果:

from typing import overload

@overload
def myfunction(first):
    ....

@myfunction.overload
def myfunction(first, second):
    ....

@myfunction.overload
def myfunction(first, second, third):
    ....

您可以通过使overload(first_fn) 函数(或构造函数)返回可调用对象来实现这一点,其中该__call__(*args) 方法执行上面解释的委托,并且该overload(another_fn) 方法添加可以委托的额外功能。

您可以在此处查看类似示例http://acooke.org/pytyp/pytyp.spec.dispatch.html,但这是按类型重载方法。这是一种非常相似的方法...

类似的东西(使用参数类型)也已添加到 Python 3 - PEP 443 - 单分派泛型函数

解决方案 3:

是的,这是可能的。我在 Python 3.2.1 中编写了以下代码:

def overload(*functions):
    return lambda *args, **kwargs: functions[len(args)](*args, **kwargs)

用法:

myfunction=overload(no_arg_func, one_arg_func, two_arg_func)

请注意,函数返回的 lambda根据未命名参数overload的数量来选择要调用的函数。

该解决方案并不完美,但目前我无法写出更好的方案。

解决方案 4:

直接这样做是不可能的。不过,你可以对给定的参数使用显式类型检查,尽管这通常是不被接受的。

Python 是动态的。如果你不确定一个对象能做什么,只需try:调用它的方法,然后就会except:出错。

如果您不需要根据类型进行重载,而只需根据参数的数量进行重载,请使用关键字参数。

解决方案 5:

以下是使用默认参数和关键字参数重载 Python 函数的方法

from multipledispatch import dispatch

# FOR hi(a: int, b: int = 3)

@dispatch(int, int)
def _hi(a: int, b: int):
    print(a, b)


@dispatch(int, int)
def hi(a: int, b: int = 3):
    _hi(a, b)


@dispatch(int, b=int)
def hi(a: int, *, b: int = 3):
    _hi(a, b)


# FOR hi(a: str, b: int = 3)

@dispatch(str, int)
def _hi(a: str, b: int):
    print(a, b, 'str!')


@dispatch(str, int)
def hi(a: str, b: int = 3):
    _hi(a, b)


@dispatch(str, b=int)
def hi(a: str, *, b: int = 3):
    _hi(a, b)

hi(2)
hi(2, 3)
hi(2, b=3)
hi('2')
hi('2', 3)
hi('2', b=3)

输出

2 3
2 3
2 3
2 3 str!
2 3 str!
2 3 str!

解决方案 6:

在 Python 中,重载方法比较棘手。但是,可以使用传递字典、列表或原始变量。

我已经针对我的用例尝试了一些方法,这可以帮助人们理解重载方法。

让我们以 Stack Overflow 上的一个问题为例:

类重载方法可以调用不同类的方法。

def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):

从远程类传递参数:

add_bullet(sprite = 'test', start=Yes, headto={'lat':10.6666, 'long':10.6666}, accelaration=10.6}

或者

add_bullet(sprite = 'test', start=Yes, headto={'lat':10.6666, 'long':10.6666}, speed=['10','20,'30']}

因此,可以通过方法重载来实现列表、字典或原始变量的处理。

用你的代码尝试一下。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1572  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   0  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   0  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用