python面向对象——重写和重载

在 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 来实现的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值