继承是像 Python 这样的面向对象编程语言中最重要特性之一。它允许一个类继承另一个类的特性和行为。继承另一个类的类被称为子类,而被继承的类则被称为基类或父类。
如果需要设计一个新的类,而这个新类的大部分属性在已有的类中已经被很好地定义了,那么就没有必要重新定义它们。继承使得现有类的功能可以被重用,并且在必要的情况下扩展来设计新的类。
当一个新类与现有的类之间存在“是一个”的关系时,继承就起作用了。例如,汽车是一个交通工具,巴士是一个交通工具,自行车也是一个交通工具。在这里,交通工具是父类,而汽车、巴士和自行车是子类。
创建父类
父类是指其属性和方法被继承的类。它就像其他类一样使用 class
关键字来定义。
语法
创建父类的语法如下所示:
class ParentClassName:
{class body}
创建子类
继承自基类的类声明类似于其父类,不过我们需要在括号内提供父类的名称。
语法
子类的语法如下:
class SubClassName (ParentClass1[, ParentClass2, ...]):
{sub class body}
继承的类型
在 Python 中,继承可以分为五种不同的类别:
Python - 单继承
这是最简单的继承形式,其中子类仅从一个父类继承属性和方法。
示例
下面的例子展示了 Python 中的单继承概念:
class Parent:
def parentMethod(self):
print ("调用父类的方法")
class Child(Parent):
def childMethod(self):
print ("调用子类的方法")
c = Child()
c.childMethod()
c.parentMethod()
执行上述代码后,将会得到以下结果:
调用子类的方法
调用父类的方法
Python - 多继承
Python 中的多继承允许你基于多个父类构建一个类。因此,子类继承了所有父类的属性和方法。子类可以覆盖任何父类的方法。
语法
class parent1:
class parent2:
class child(parent1, parent2):
示例
Python 的标准库中有一个内置的 divmod()
函数,返回一个包含两个元素的元组。第一个数字是两个参数的除法结果,第二个是模数。
这个例子试图模仿 divmod()
函数。我们定义了两个类 division
和 modulus
,然后有一个继承自它们的 div_mod
类。
class division:
def __init__(self, a, b):
self.n = a
self.d = b
def divide(self):
return self.n / self.d
class modulus:
def __init__(self, a, b):
self.n = a
self.d = b
def mod_divide(self):
return self.n % self.d
class div_mod(division, modulus):
def __init__(self, a, b):
self.n = a
self.d = b
def div_and_mod(self):
divval = division.divide(self)
modval = modulus.mod_divide(self)
return (divval, modval)
子类有一个新的方法 div_and_mod()
,该方法内部调用从继承类继承的 divide()
和 mod_divide()
方法来返回除法和模数。
x = div_mod(10, 3)
print ("除法:", x.divide())
print ("模除:", x.mod_divide())
print ("divmod:", x.div_and_mod())
输出结果如下:
除法: 3.3333333333333335
模除: 1
divmod: (3.3333333333333335, 1)
方法解析顺序(MRO)
方法解析顺序(MRO)与 Python 中的多继承有关。在 Python 中,继承可以在多个层级上进行。例如,A 是 B 的父类,而 B 又是 C 的父类。类 C 可以覆盖继承的方法或者其对象可以按照在父类中定义的方式调用它。那么 Python 是如何找到适当的方法来调用的呢?
每个 Python 类都有一个 mro()
方法,返回 Python 用来解析方法调用的层次顺序。解析顺序是从继承链的底部到顶部。
在前面的例子中,div_mod
类继承了 division
和 modulus
类。因此,mro
方法返回的顺序如下:
[<class '__main__.div_mod'>, <class '__main__.division'>, <class '__main__.modulus'>, <class 'object'>]
Python - 多级继承
在多级继承中,一个类从另一个已经派生出的类中派生。存在多层继承。我们可以想象成祖父母-父母-孩子的关系。
示例
下面的例子展示了多级继承的工作原理:
class Universe:
def universeMethod(self):
print ("我在宇宙中")
class Earth(Universe):
def earthMethod(self):
print ("我在地球上")
class India(Earth):
def indianMethod(self):
print ("我在印度")
person = India()
person.universeMethod()
person.earthMethod()
person.indianMethod()
当我们执行上述代码时,将会得到以下结果:
我在宇宙中
我在地球上
我在印度
Python - 层次继承
这种类型的继承包含多个从单一基类继承的派生类。这类似于组织内的层次结构。
示例
下面的例子展示了层次继承。这里我们定义了 Manager
类的两个子类。
class Manager:
def managerMethod(self):
print ("我是经理")
class Employee1(Manager):
def employee1Method(self):
print ("我是员工一")
class Employee2(Manager):
def employee2Method(self):
print ("我是员工二")
emp1 = Employee1()
emp2 = Employee2()
emp1.managerMethod()
emp1.employee1Method()
emp2.managerMethod()
emp2.employee2Method()
执行上述程序后,你会得到以下输出:
我是经理
我是员工一
我是经理
我是员工二
Python - 混合继承
两种或多种类型的继承的组合被称为混合继承。例如,它可以是单继承和多继承的混合。
示例
在这个例子中,我们将单继承和多继承结合起来形成类的混合继承。
class CEO:
def ceoMethod(self):
print ("我是 CEO")
class Manager(CEO):
def managerMethod(self):
print ("我是经理")
class Employee1(Manager):
def employee1Method(self):
print ("我是员工一")
class Employee2(Manager, CEO):
def employee2Method(self):
print ("我是员工二")
emp = Employee2()
emp.managerMethod()
emp.ceoMethod()
emp.employee2Method()
执行上述程序后,将会得到以下结果:
我是经理
我是 CEO
我是员工二
super() 函数
在 Python 中,super()
函数允许你在子类中访问父类的方法和属性。
示例
在下面的例子中,我们创建了一个父类,并使用 super()
函数从子类中访问其构造函数。
class ParentDemo:
def __init__(self, msg):
self.message = msg
def showMessage(self):
print(self.message)
class ChildDemo(ParentDemo):
def __init__(self, msg):
super().__init__(msg)
obj = ChildDemo("欢迎来到 Tutorialspoint!!")
obj.showMessage()
执行上述程序后,将会得到以下结果:
欢迎来到 Tutorialspoint!!