原文: https://www.programiz.com/python-programming/inheritance

继承使我们能够定义一个类,该类从父类中获取所有功能,并允许我们添加更多功能。 在本教程中,您将学习在 Python 中使用继承。

Python 继承

继承是面向对象编程中的一项强大功能。

它指的是定义新的,而对现有类几乎没有修改。 新类称为派生类(或子类),而从其继承的新类称为基类(或父类)


Python 继承语法

  1. class BaseClass:
  2. Body of base class
  3. class DerivedClass(BaseClass):
  4. Body of derived class

派生类从基类继承功能,可以在其中添加新功能。 这导致代码的可重用性。


Python 中的继承示例

为了演示继承的使用,让我们举一个例子。

多边形是具有 3 个或更多边的闭合图形。 说,我们有一个名为Polygon的类,定义如下。

  1. class Polygon:
  2. def __init__(self, no_of_sides):
  3. self.n = no_of_sides
  4. self.sides = [0 for i in range(no_of_sides)]
  5. def inputSides(self):
  6. self.sides = [float(input("Enter side "+str(i+1)+" : ")) for i in range(self.n)]
  7. def dispSides(self):
  8. for i in range(self.n):
  9. print("Side",i+1,"is",self.sides[i])

此类具有数据属性,以将面数n和每一面的大小存储为称为side的列表。

inputSides()方法采用每边的大小,dispSides()显示这些边的长度。

三角形是具有 3 个边的多边形。 因此,我们可以创建一个名为Triangle的类,该类继承自Polygon。 这使Polygon类的所有属性可用于Triangle类。

我们不需要再次定义它们(代码可重用性)。Triangle可以定义如下。

  1. class Triangle(Polygon):
  2. def __init__(self):
  3. Polygon.__init__(self,3)
  4. def findArea(self):
  5. a, b, c = self.sides
  6. # calculate the semi-perimeter
  7. s = (a + b + c) / 2
  8. area = (s*(s-a)*(s-b)*(s-c)) ** 0.5
  9. print('The area of the triangle is %0.2f' %area)

但是,类Triangle具有查找和打印三角形区域的新方法findArea()。 这是一个示例运行。

  1. >>> t = Triangle()
  2. >>> t.inputSides()
  3. Enter side 1 : 3
  4. Enter side 2 : 5
  5. Enter side 3 : 4
  6. >>> t.dispSides()
  7. Side 1 is 3.0
  8. Side 2 is 5.0
  9. Side 3 is 4.0
  10. >>> t.findArea()
  11. The area of the triangle is 6.00

我们可以看到,即使我们没有为类Triangle分别定义inputSides()dispSides()之类的方法,我们仍然可以使用它们。

如果在类本身中找不到属性,则搜索继续到基类。 如果基类本身是从其他类派生的,则将递归重复此操作。


Python 中的方法覆盖

在上面的示例中,请注意,在TrianglePolygon这两个类别中都定义了__init__()方法。 发生这种情况时,派生类中的方法将覆盖基类中的方法。 也就是说,Triangle中的__init__()优先于Polygon中的__init__

通常,当覆盖基本方法时,我们倾向于扩展定义而不是简单地替换它。 通过从派生类中的基类中调用基类中的方法(从Triangle中的__init__()中调用Polygon.__init__())来完成相同的操作。

更好的选择是使用内置函数super()。 因此,super().__init__(3)等同于Polygon.__init__(self,3),因此是首选。 要了解有关 Python 中super()函数的更多信息,请访问 Python super()函数

两个内置函数isinstance()issubclass()用于检查继承。

如果对象是该类或从其派生的其他类的实例,则函数isinstance()返回True。 Python 中的每个类都继承自基类object

  1. >>> isinstance(t,Triangle)
  2. True
  3. >>> isinstance(t,Polygon)
  4. True
  5. >>> isinstance(t,int)
  6. False
  7. >>> isinstance(t,object)
  8. True

同样,issubclass()用于检查类继承。

  1. >>> issubclass(Polygon,Triangle)
  2. False
  3. >>> issubclass(Triangle,Polygon)
  4. True
  5. >>> issubclass(bool,int)
  6. True