Python 中的继承
继承是面向对象编程中的一个强大功能。
它指的是定义一个新类,对现有类进行很少或没有修改。新类称为派生(或子)类,它继承的类称为基(或父)类。
Python 继承语法
类基类: 基类的主体 类派生类(基类): 派生类的主体
派生类从基类继承功能,可以在其中添加新功能。这导致代码的可重用性。
Python 中的继承示例
为了演示继承的使用,让我们举一个例子。
多边形是具有 3 个或更多边的封闭图形。比如说,我们有一个名为的类,Polygon定义如下。
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 和每一边的大小作为一个列表,称为 边.
该inputSides()方法接收每条边的大小并dispSides()显示这些边长。
三角形是具有 3 条边的多边形。因此,我们可以创建一个名为的类三角形 继承自 多边形. 这使得所有的属性多边形 可用的类 三角形 班级。
我们不需要再次定义它们(代码可重用性)。 三角形 可以定义如下。
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()来查找和打印三角形的面积。这是一个示例运行。
>>> 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
我们可以看到,即使我们没有单独定义类inputSides()或dispSides()类的方法Triangle,我们也可以使用它们。
如果在类本身中找不到属性,则搜索将继续到基类。如果基类本身是从其他类派生的,则递归重复。
Python 中的方法覆盖
在上面的例子中,注意init()在两个类中都定义了方法,三角形 还有 多边形. 发生这种情况时,派生类中的方法会覆盖基类中的方法。这就是说,init()在三角形优先于initin多边形.
通常,在覆盖基本方法时,我们倾向于扩展定义而不是简单地替换它。通过从派生类中的方法调用基类中的方法(Polygon.init()从init()in调用Triangle)来完成相同的操作。
更好的选择是使用内置函数super()。所以,super().init(3)相当于Polygon.init(self,3)并且是首选。要了解有关super()Python 函数的更多信息,请访问Python super() 函数。
两个内置函数isinstance(),issubclass()用于检查继承。
如果对象是类或从它派生的其他类的实例,则该函数isinstance()返回True。Python 中的每个类都继承自基类object。
>>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True
同样,issubclass()用于检查类继承。
>>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True