在 Python 中,函数重载不像在其他一些语言(如 C++ 和 Java)中那样直接支持。Python 不支持函数签名不同的同名函数,因为在 Python 中,函数名在命名空间中必须是唯一的。

不过,可以使用一些技巧来实现类似的效果,最常见的方法是使用默认参数或可变参数列表 (*args**kwargs) 来创建一个函数,可以处理不同数量和类型的参数。

以下是一些实现函数重载的常见方法:

方法一:使用默认参数

1
2
def greet(name="World"):
print(f"Hello, {name}!")

方法二:使用可变参数列表

1
2
3
4
5
6
7
def greet(*args):
if len(args) == 0:
print("Hello, World!")
elif len(args) == 1:
print(f"Hello, {args[0]}!")
else:
print("Hello, everyone!")

方法三:使用类型检查

你还可以使用 isinstance 来检查参数的类型,以实现类似于函数重载的效果。

1
2
3
4
5
6
7
def greet(person):
if isinstance(person, str):
print(f"Hello, {person}!")
elif isinstance(person, list):
print("Hello, " + ", ".join(person) + "!")
else:
print("Hello, World!")

方法四:使用 functools 模块的 singledispatch 装饰器(Python 3.4+)

singledispatch 是 Python 的一个装饰器,可以用于实现基于单一参数类型的函数重载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from functools import singledispatch

@singledispatch
def greet(arg):
print("Hello, World!")

@greet.register
def _(arg: str):
print(f"Hello, {arg}!")

@greet.register
def _(arg: list):
print("Hello, " + ", ".join(arg) + "!")

# 使用方法
greet() # 输出: Hello, World!
greet("Alice") # 输出: Hello, Alice!
greet(["Alice", "Bob"]) # 输出: Hello, Alice, Bob!

这些方法可以帮助你在 Python 中实现类似函数重载的行为。