Python继承

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

在本教程中,我们将学习OOPS概念继承以及如何在Python中使用继承。

继承概念

继承使我们可以创建一个类,该类获取另一个类的所有属性和方法。

其成员被继承的类称为Super类。也称为父类或者基类。
从另一个类继承的类称为Sub类。也称为子类或者派生类。

Python继承语法

如果有一个名为ParentClass的类定义为

class ParentClass:
	body of parent class

然后可以将从此ParentClass继承的ChildClass定义为

class ChildClass(ParentClass):
	body of child class

继承Python示例

在示例中,有一个名为Person的类充当基类,另一个类Employee继承自Person类。

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

    def display_person(self):
        print('In display_person method')
        print('Name:', self.name)
        print('Age:', self.age)

class Employee(Person):
    pass

e = Employee("Michael Weyman", 42)
e.display_person()

输出:

In display_person method
Name: Michael Weyman
Age: 42

如我们所见,在Employee类中,只是pass关键字用于指定它不会向类添加任何属性或者方法。它仅继承其继承的类的所有属性和方法。
我们可以创建Employee类的对象并初始化'name'和'age'属性,因为Employee类继承了Person类的这些属性。同样,我们也可以使用Employee类的对象调用方法display_person()方法。

构造函数的重载和对继承的使用

当一个类在Python中继承另一个类时,默认情况下,子类也可以使用超类的构造函数。如果子类中有额外的字段需要在子类中进行初始化,则可以覆盖子类中的构造函数以在那里初始化字段。

在大多数情况下,我们都将从基类继承,并在子类中添加其自身的属性和方法。要初始化子类的属性,我们也可以在子类中添加__init __()函数。在我们的Employee类中,我们添加两个字段person_id和department,并添加一个方法display_employee()。

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

    def display_employee(self):
        print('In display_employee method')
        print('Id:', self.person_id)
        print('Name:', self.name)
        print('Age:', self.age)
        print('Department:', self.department)

在上面的类中,我们可以注意到在构造函数中初始化父类字段是多余的,尽管在父类中已经有一个构造函数正在执行此操作。在display_employee()方法中,我们也有打印语句来打印姓名和年龄,尽管在Person类中已经有一个方法可以这样做。

如果要从子类中调用超类构造函数和方法,可以使用super()函数来完成,这有助于避免上述Employee类中存在的代码冗余。这是使用super()函数的经过修改的Employee类。

class Employee(Person):
    def __init__(self, person_id, department, name, age):
        # call constructor of super class
        super().__init__(name, age)
        self.person_id = person_id
        self.department = department

    def display_employee(self):
        # call method of super class
        super().display_person()
        print('In display_employee method')
        print('Id:', self.person_id)
        print('Department:', self.department)

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

输出:

In display_person method
Name: Michael Weyman
Age: 42
In display_employee method
Id: 1
Department: IT

继承的优点

  • 继承有助于编写可重用的代码,我们可以在其中仅通过从现有类继承而使用现有功能。
  • 继承有助于编写层次结构代码,其中我们可以在超类中编写更通用的代码,然后继续继承它并添加更多特定的方法。例如,我们可以拥有一个Vehicle超类,它具有更通用的功能,例如Accelerate(),brake(),gear()。然后继承它以创建更专业的类,如Car,Bus,MotorCycle,然后继承自Car来创建更特定的类,如SUV,SportsCar。
  • 此外,由于我们不将所有功能都放在同一个类中,而是创建多个类来创建具有在这些类之间分布的代码的分层结构,因此使代码管理变得容易。