Python 继承

继承允许我一个类从继承另一个类的所有方法和属性,是代码复用的一种很重要的方法。本文中讲述了 Python 中如何使用继承。

继承允许我一个类从继承另一个类的所有方法和属性,是代码复用的一种很重要的方法。

继承使用的术语:

  • 父类: 被继承的类,也称为基类。
  • 子类: 继承父类的类,也称为派生类。

创建父类

任何类都可以是父类,创建父类就是创建一个普通的类。

以下示例创建了一个名为 Person 类, 拥有 firstnamelastname 两个属性,以及一个 printname 方法。

class Person:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname
  def printname(self):
    print(self.firstname, self.lastname)

x = Person("John", "Doe")
x.printname() # John Doe

创建子类

要创建一个继承某个基类的子类,请在创建子类时将父类作为参数。

以下示例 创建一个名为 Student 的类,它继承 Person 类的属性和方法。

class Student(Person):
  pass

! pass 关键字表示此类没有定义任何属性和方法。

现在 Student 类具有与 Person 类相同的属性和方法。

使用 Student 类创建对象,然后执行 printname 方法:

class Person:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname
  def printname(self):
    print(self.firstname, self.lastname)

class Student(Person):
  pass

x = Student("Mike", "Olsen")
x.printname() # Mike Olsen

添加 init() 方法

到目前为止,我们已经创建了一个继承父类的属性和方法的子类。

__init__() 方法添加到 Student 类中:

class Student(Person):
  def __init__(self, fname, lname):
    #add properties etc.

添加 __init__() 方法后,子类将不再继承父类的 __init__() 方法。

! 注: 子类的 __init__() 方法覆盖了父类的 __init__() 方法。

为了保持父类 __init__() 方法的继承,添加调用父类的初始化方法。如下,可以直接使用类名调用:

class Student(Person):
  def __init__(self, fname, lname):
    Person.__init__(self, fname, lname)

现在我们已经成功添加了初始化方法,并保留了父类的继承性,我们准备在 __init__() 方法中添加其他功能。

使用 super() 方法

Python 还有一个 super() 方法,可以在子类中获取到父类的信息。

class Student(Person):
  def __init__(self, fname, lname):
    super().__init__(fname, lname)

通过使用 super() 方法,您不必再使用父类的名称,它代表的就是父类。

添加属性

Student 类中添加一个 graduationyear 属性代表毕业的年份。为了能够正确的初始化对象,还需要添加一个参数 year,以便在初始化对象的时候为 graduationyear 赋值。

class Student(Person):
  def __init__(self, fname, lname, year):
    super().__init__(fname, lname)
    self.graduationyear = year

x = Student("Mike", "Olsen", 2019)

添加方法

Student 类中添加一个 welcome 方法,以打印欢迎语。

class Student(Person):
  def __init__(self, fname, lname, year):
    super().__init__(fname, lname)
    self.graduationyear = year

  def welcome(self):
    print("Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear)

如果在子类中添加与父类中的方法同名的方法,则会覆盖从父类继承的方法。

完整示例

下面展示了一个完整的例子,可以直接在 Python 控制台中运行。

class Person:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname
  def printname(self):
    print(self.firstname, self.lastname)

class Student(Person):
  def __init__(self, fname, lname, year):
    super().__init__(fname, lname)
    self.graduationyear = year
  def welcome(self):
    print("Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear)


x = Student("Mike", "Olsen", 2019)
x.welcome()  # Welcome Mike Olsen to the class of 2019