在 Python 中,重写(Override)和重载(Overload)是面向对象编程中的两个不同的概念:
重写(Override)
重写是指在子类中定义一个与父类同名的方法。当你调用这个方法时,Python 会执行子类中的版本,这样就允许子类改变或扩展父类的行为。
class Parent:
def say_hello(self):
print("Hello from Parent")
class Child(Parent):
def say_hello(self):
print("Hello from Child")
# 使用
child = Child()
child.say_hello() # 输出: Hello from Child
在这个例子中,Child
类重写了 Parent
类的 say_hello
方法。
重载(Overload)
重载是指允许一个类中存在多个同名方法,但是这些方法的参数不同(参数的数量或类型不同)。Python 原生并不支持方法重载,因为它是动态类型语言,方法的参数是不固定的。但是,你可以通过默认参数、关键字参数或者可变参数来实现类似重载的效果。
class Calculator:
def add(self, a, b, c=0):
return a + b + c
# 使用
calc = Calculator()
print(calc.add(1, 2)) # 输出: 3 (相当于重载 add(a, b))
print(calc.add(1, 2, 3)) # 输出: 6 (相当于重载 add(a, b, c))
在这个例子中,add
方法可以接受两个或三个参数,这通过默认参数实现了类似重载的功能。
如果你想要实现更传统意义上的方法重载,可以使用 functools
模块中的 singledispatch
装饰器来装饰一个函数,使其根据第一个参数的类型执行不同的操作。
from functools import singledispatch
@singledispatch
def say(data):
print(f"Received data: {data}")
@say.register
def _(data: int):
print(f"Received an integer: {data}")
@say.register
def _(data: str):
print(f"Received a string: {data}")
# 使用
say(42) # 输出: Received an integer: 42
say("Hello") # 输出: Received a string: Hello
这里,singledispatch
装饰器允许你根据参数的类型来重载 say
函数。
总结一下,Python 中的重写是子类改变继承自父类的方法的行为,而重载通常是通过使用默认参数、关键字参数或者可变参数,或者使用 functools.singledispatch
来实现的。