企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# Python 继承 > 原文: [https://www.programiz.com/python-programming/inheritance](https://www.programiz.com/python-programming/inheritance) #### 继承使我们能够定义一个类,该类从父类中获取所有功能,并允许我们添加更多功能。 在本教程中,您将学习在 Python 中使用继承。 ## Python 继承 继承是面向对象编程中的一项强大功能。 它指的是定义新的[类](/python-programming/class),而对现有类几乎没有修改。 新类称为**派生类(或子类)**,而从其继承的新类称为**基类(或父类)**。 * * * ### Python 继承语法 ```py class BaseClass: Body of base class class DerivedClass(BaseClass): Body of derived class ``` 派生类从基类继承功能,可以在其中添加新功能。 这导致代码的可重用性。 * * * ### Python 中的继承示例 为了演示继承的使用,让我们举一个例子。 多边形是具有 3 个或更多边的闭合图形。 说,我们有一个名为`Polygon`的类,定义如下。 ```py class Polygon: def __init__(self, no_of_sides): self.n = no_of_sides self.sides = [0 for i in range(no_of_sides)] def inputSides(self): self.sides = [float(input("Enter side "+str(i+1)+" : ")) for i in range(self.n)] def dispSides(self): for i in range(self.n): print("Side",i+1,"is",self.sides[i]) ``` 此类具有数据属性,以将面数`n`和每一面的大小存储为称为`side`的列表。 `inputSides()`方法采用每边的大小,`dispSides()`显示这些边的长度。 三角形是具有 3 个边的多边形。 因此,我们可以创建一个名为`Triangle`的类,该类继承自`Polygon`。 这使`Polygon`类的所有属性可用于`Triangle`类。 我们不需要再次定义它们(代码可重用性)。`Triangle`可以定义如下。 ```py class Triangle(Polygon): def __init__(self): Polygon.__init__(self,3) def findArea(self): a, b, c = self.sides # calculate the semi-perimeter s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('The area of the triangle is %0.2f' %area) ``` 但是,类`Triangle`具有查找和打印三角形区域的新方法`findArea()`。 这是一个示例运行。 ```py >>> t = Triangle() >>> t.inputSides() Enter side 1 : 3 Enter side 2 : 5 Enter side 3 : 4 >>> t.dispSides() Side 1 is 3.0 Side 2 is 5.0 Side 3 is 4.0 >>> t.findArea() The area of the triangle is 6.00 ``` 我们可以看到,即使我们没有为类`Triangle`分别定义`inputSides()`或`dispSides()`之类的方法,我们仍然可以使用它们。 如果在类本身中找不到属性,则搜索继续到基类。 如果基类本身是从其他类派生的,则将递归重复此操作。 * * * ## Python 中的方法覆盖 在上面的示例中,请注意,在`Triangle`和`Polygon`这两个类别中都定义了`__init__()`方法。 发生这种情况时,派生类中的方法将覆盖基类中的方法。 也就是说,`Triangle`中的`__init__()`优先于`Polygon`中的`__init__`。 通常,当覆盖基本方法时,我们倾向于扩展定义而不是简单地替换它。 通过从派生类中的基类中调用基类中的方法(从`Triangle`中的`__init__()`中调用`Polygon.__init__()`)来完成相同的操作。 更好的选择是使用内置函数`super()`。 因此,`super().__init__(3)`等同于`Polygon.__init__(self,3)`,因此是首选。 要了解有关 Python 中`super()`函数的更多信息,请访问 [Python `super()`函数](http://rhettinger.wordpress.com/2011/05/26/super-considered-super/)。 两个内置函数`isinstance()`和`issubclass()`用于检查继承。 如果对象是该类或从其派生的其他类的实例,则函数`isinstance()`返回`True`。 Python 中的每个类都继承自基类`object`。 ```py >>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True ``` 同样,`issubclass()`用于检查类继承。 ```py >>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True ```