Python中方法重写

时间:2020-01-09 10:44:19  来源:igfitidea点击:

在这篇文章中,我们将了解Python中的方法覆盖的工作原理。

什么是方法重写

方法重写,方法覆盖(Method overriding)是一种面向对象的编程概念,它指出子类可以提供其父类之一中已经存在的方法的不同实现。如果子类中的方法与父类中的方法具有相同的名称,相同数量的参数和相同的返回类型,则认为子类将覆盖父类的方法。

Python方法重载示例

在该示例中,存在一个层次结构,其中父类Person具有方法display_info()。子类Employee重写方法display_info()并提供其自己的实现。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def display_info(self):
        print('In display_info method of Person class')
        print('Name:', self.name)
        print('Age:', self.age)

class Employee(Person):
    def __init__(self, emp_id, department, name, age):
        super().__init__(name, age)
        self.emp_id = emp_id
        self.department = department

    def display_info(self):
        Person.display_info(self)
        print('In display_info method of Employee class')
        print('Id:', self.emp_id)
        print('Department:', self.department)

e = Employee(1, "IT", "Michael Weyman", 42)
e.display_info()
p = Person("Michael Weyman", 42)
p.display_info()

输出:

In display_info method of Person class
Name: Michael Weyman
Age: 42
In display_info method of Employee class
Id: 1
Department: IT
In display_info method of Person class
Name: Michael Weyman
Age: 42

如我们所见,当我们有一个Employee类的对象时,将调用Employee类(子类)的display_info()方法。如果object是Person类的,则Person类的display_info()方法(调用父类)。

在重写的方法中调用父类的方法

如果需要,可以从子类中调用父类的方法。一种方法是使用类名称CLASS_NAME.method_name(self)。在上面的示例中已经使用了这种方式。

另一种更好的方法是在Python中使用super()函数来调用超类的方法。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def display_info(self):
        print('In display_info method of Person class')
        print('Name:', self.name)
        print('Age:', self.age)

class Employee(Person):
    def __init__(self, emp_id, department, name, age):
        super().__init__(name, age)
        self.emp_id = emp_id
        self.department = department

    def display_info(self):
        super().display_info()
        print('In display_info method of Employee class')
        print('Id:', self.emp_id)
        print('Department:', self.department)

e = Employee(1, "IT", "Michael Weyman", 42)
e.display_info()

输出:

In display_info method of Person class
Name: Michael Weyman
Age: 42
In display_info method of Employee class
Id: 1
Department: IT

在示例中,我们可以看到使用super()调用父类方法。