上一章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
推荐阅读
- python3多重继承 – Python3教程
- python3对象和类 – Python3教程
- python3面向对象编程 – Python3教程
- java|程序员加班实用贴 | 每日趣闻
- 人工智能|GPT-3(现实版的“贾维斯”(还是真“人工”智能?))
- 人工智能|复旦博士生写了130行代码,用OCR和正则表达式快速搞定核酸报告统计!
- java|复旦博士写了130行代码,2分钟解决繁琐核酸报告核查
- python3自定义异常 – Python3教程
- python3异常处理(try,except和finally – Python3教程)