python3继承 – Python3教程

上一章Python教程请查看:python3对象和类
继承使我们能够定义一个类,它继承父类的所有功能并允许我们添加更多的功能,在本文中,你将学习如何在Python中使用继承。
继承是什么?继承是面向对象编程中的一个强大特性。
它指的是定义一个新类,只需要对现有类进行少量或不进行修改,新类称为派生类(或子类),其继承的类称为基类(或父类)。
Python继承的语法

class BaseClass: Body of base class class DerivedClass(BaseClass): Body of derived class

派生类继承基类的特性,并向其添加新特性,这导致了代码的可重用性。
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()考虑每个边的大小,同样地,sides()将正确显示这些大小。
三角形是有三条边的多边形,因此,我们可以创建一个名为Triangle的类,它继承自Polygon,这使得类Polygon的所有属性在Triangle中都是可用的么,我们不需要重新定义它们(代码可重用性)。三角形的定义如下。
class Triangle(Polygon): def __init__(self): Polygon.__init__(self,3) def findArea(self): a, b, c = self.sides # 计算semi-perimeter s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('三角形的面积是 %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() 三角形的面积是 6.00

我们可以看到,尽管我们没有为类Triangle定义inputSides()或sides()之类的方法,但是我们能够使用它们。
如果在类中没有找到属性,则继续搜索基类,如果基类本身是从其他类派生而来,则此操作将递归地重复。
Python中的方法覆盖在上面的例子中,注意两个类中都定义了_init__()方法,三角形和多边形也是如此。发生这种情况时,派生类中的方法将覆盖基类中的方法,也就是说,三角形中的init__()比多边形中的具有相同的优先级。
通常,当覆盖基本方法时,我们倾向于扩展定义,而不是简单地替换它。通过从派生类中调用基类中的方法(在三角形中调用polygon._ init__() from _init__()),可以实现相同的操作。
更好的选择是使用内置函数super()。因此,super().__ init__(3)等价于polygon.__ init__(self,3),是首选的。你可以了解更多关于Python中的super()函数的信息。
两个内置函数isinstance()和issubclass()用于检查继承,函数isinstance()返回True,如果对象是该类的一个实例,或者是从该类派生的其他类,Python中的每个类都继承自基类对象。
>>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True

【python3继承 – Python3教程】类似地,issubclass()用于检查类继承。
>>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True

    推荐阅读