Python 继承
继承允许我一个类从继承另一个类的所有方法和属性,是代码复用的一种很重要的方法。本文中讲述了 Python 中如何使用继承。
继承允许我一个类从继承另一个类的所有方法和属性,是代码复用的一种很重要的方法。
继承使用的术语:
- 父类: 被继承的类,也称为基类。
- 子类: 继承父类的类,也称为派生类。
创建父类
任何类都可以是父类,创建父类就是创建一个普通的类。
以下示例创建了一个名为 Person
类, 拥有 firstname
和 lastname
两个属性,以及一个 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