📜  Python方法重载和方法覆盖的区别(1)

📅  最后修改于: 2023-12-03 15:19:33.934000             🧑  作者: Mango

Python方法重载和方法覆盖的区别

在 Python 中,方法重载和方法覆盖是两个非常重要的概念。虽然它们的名字看起来很相似,但它们却有着很大的区别。

方法重载

方法重载是指在同一个类中定义多个名称相同但参数类型或参数个数不同的方法。这样,我们就可以根据不同的参数类型或参数个数来调用不同的方法。

下面是一个简单的例子,演示了如何在 Python 中实现方法重载:

class MyClass:
    def my_method(self, x):
        print("my_method with 1 parameter")

    def my_method(self, x, y):
        print("my_method with 2 parameters")

在上面的代码中,我们定义了一个名为 MyClass 的类,并在其中定义了两个名为 my_method 的方法。第一个方法接收一个参数 x,第二个方法接收两个参数 xy。这两个方法的名称相同,但参数个数却不同。因此,它们属于方法重载。

然而,当我们尝试调用这些方法时,Python 会抛出一个异常:

my_object = MyClass()
my_object.my_method(1)
my_object.my_method(2, 3)

运行上面的代码,我们会遇到以下错误:

Traceback (most recent call last):
  File "main.py", line 8, in <module>
    my_object.my_method(1)
TypeError: my_method() missing 1 required positional argument: 'y'

这是因为,在 Python 中,方法重载是不支持的。当我们定义多个名称相同的方法时,后面的方法会覆盖掉前面的方法。也就是说,只有最后一个方法会被 Python 执行,之前的所有方法都会被忽略掉。

方法覆盖

方法覆盖是指在子类中重新定义父类中已有的方法。这样,当我们创建子类的对象并调用这个方法时,子类中的方法会覆盖掉父类中的方法,从而改变方法的行为。

下面是一个简单的例子,演示了如何在 Python 中实现方法覆盖:

class ParentClass:
    def my_method(self):
        print("ParentClass my_method")

class ChildClass(ParentClass):
    def my_method(self):
        print("ChildClass my_method")

parent_object = ParentClass()
parent_object.my_method()

child_object = ChildClass()
child_object.my_method()

在上面的代码中,我们定义了两个类 ParentClassChildClassParentClass 中定义了一个名为 my_method 的方法,它打印输出一条字符串。ChildClass 继承了 ParentClass,并重新定义了父类中的 my_method 方法。

当我们创建一个 ParentClass 的对象并调用 my_method 方法时,它会输出 ParentClass my_method。当我们创建一个 ChildClass 的对象并调用 my_method 方法时,它会输出 ChildClass my_method。这是因为,子类 ChildClass 中的 my_method 方法覆盖了父类 ParentClass 中的 my_method 方法,从而改变了方法的行为。

因此,方法重载和方法覆盖虽然在名称上很相似,但它们却有着非常不同的含义和用途。在 Python 中,我们不支持方法重载,但支持方法覆盖。通过方法覆盖,我们可以定义一个子类来改变父类中已有方法的行为,从而实现更加灵活的程序设计。