当前位置: 首页 > news >正文

网站建设平台选择网络服务中心

网站建设平台选择,网络服务中心,上海社区网站建设,wordpress葬爱导航本书同名免费MOOC《Python编程基础及应用》在哔哩哔哩(B站)热播#xff0c;作者带着你学。版权声明#xff1a;本文内容引用自作者的图书《Python编程基础及应用》(高等教育出版社)。本文可以在互联网上转载传播#xff0c;但必须包含文中的版权声明#xff1b;本文不可以以…本书同名免费MOOC《Python编程基础及应用》在哔哩哔哩(B站)热播作者带着你学。版权声明本文内容引用自作者的图书《Python编程基础及应用》(高等教育出版社)。本文可以在互联网上转载传播但必须包含文中的版权声明本文不可以以纸质出版为目的进行摘抄或改编。9.8 多态、抽象类多态(polymorphism)是面向对象程序设计的一个重要概念源自希腊语意即“有多种形态”。对于程序设计而言大致可以理解为即使你不知道变量指向哪种形态也能够对其执行操作而且操作的行为将随对象的类型不同而不同。对于Python程序员而言可以不关心这个概念。因为在Python语言中默认就是多态的。也就是说对象被执行某个函数的时候他的行为跟你想的多半是一样的。但作者认为读者还是应该了解这个概念并理解其在程序设计中的重要性。想象一个Word类软件WPS或者Open Office之类在文档中用户会加入非常多的界面元素包括但不限于三角形、箭头、段落、圆形、矩形、艺术字、图片。对就跟你想的一样在面向对象程序设计中这些元素都会使用类来描述并且设计者一定会为这些界面元素提供一个统一的父类。作者把这个类结构简化成下图的模样读者要明白真实的情况比这个要复杂得多但基本结构大体如此。可以看到所有的界面元素三角形、圆形、... 、 文本段落(paragraph)被描述成拥有一个共同的祖先类-Shape。这个祖先类可以是抽象类这意味着系统不允许你创建Shape类的对象具体的稍后描述。抽象类什么具体的工作也不做只是描述了他的全部后代的模样至少实现draw()-描绘自身以及getSize()-返回元素在页面中的空间尺寸信息这两个方法。这种描述是强制性的它的后代必须实现这两个方法或函数。Triangle类用三个点坐标来描述自己的属性除了实现必须的draw()和getSize()方法外还实现了一个getArea()方法以计算自身所占面积。Circle类则用一个圆点坐标以及一个半径来描述自己也实现了额外的getArea()函数。文本段落(Paragraph)类则用一个字符串sContent来存储其文本内容另外还额外实现了setFont()函数来设置文本的字体和字体大小。作者把这4个类组织一个程序文件里命名Shapes.py。首先我们定义抽象基类Shape。#Shapes.pyfrom abc import ABC, abstractmethodclass Shape(ABC): abstractmethod def draw(self): pass abstractmethod def getSize(self): pass首先我们从abc模块导入了ABC及abstractmethod。abc的意思作者猜应该是abstract base class - 抽象基类的首字母缩写。Shape被描述成ABC的子类draw()函数以及getSize()函数都打上了abstractmethod装饰符这说明这两个函数为抽象函数。这种情况下系统是不允许创建一个Shape对象的。这个抽象类存在的唯一意义就是规定了它的后代类的某些特征必须实现 draw()及getSize()方法。如果尝试实例化Shape, 比如s Shape()就会得到下述错误信息Traceback (most recent call last): File D:/pylearn/C9_OOP/Shapes.py, line 11, in s Shape()TypeError: Cant instantiate abstract class Shape with abstract methods draw, getSize当且仅当Shape的某个后代类定义实现了Shape的全部抽象函数该类才可以被实例化 - 即允许创建该类型的对象。下面是Triangle类、Circle类、Paragraph类的极简版本代码注意连同Shape类这4个类都在同一个py文件中。#Shapes.py...class Triangle(Shape): def __init__(self): self.point0 (0,0) self.point1 (0,0) self.point2 (0,0) def draw(self): print(Triangle::draw) def getSize(self): pass #detail omitted def getArea(self): return 0 #it should be w * h / 2#Shapes.py...class Circle(Shape): def __init__(self): self.ptCenter (0,0) self.iRadius 0 def draw(self): print(Circle::draw) def getSize(self): pass def getArea(self): return 0#Shapes.py...class Paragraph(Shape): def __init__(self): self.sContent def draw(self): print(Paragraph::draw) def getSize(self): pass def setFont(self,fontName,fontSize): pass这三个类都实现了Shape抽象基类的全部抽象方法都不再“抽象”可以实例化。另外我们还注意到这三个类的构造函数里都没有调用执行Shape类的构造函数这里这样做是可以的因为Shape类没有自定义构造函数或者说Shape类的构造函数什么也没做。让我们把关注点放在这三个类的draw()函数上。Office类软件会用文档来组织这些界面元素在这里我们把这些界面元素想像成一个列表在这个列表里包含了很多个三角形、矩形、段落、图片、艺术字、公式、图表对象这些对象都是Shape类的子对象都实现了draw()方法。当一个页面被显示出来时软件会遍历这个列表然后逐一调用列表内Shape子对象的draw()方法以便把每个界面元素画出来。对你听得没错就是每个对象自己画自己。因为三角形类了解三角形的数据表达形式掌握描绘一个三角形的全部信息由这个类的draw()来承担这个职责再合适不过了。圆形、段落这些类也是类似情况。我们设想一下假设在页面上描绘三角形的任务不是由三角形类来完成而是由外部代码来完成那么外部代码就必须清楚并访问三角形对象内部的全部细节如果这件事情真的发生的话对于软件工程而言是灾难性的外部代码知道太多关于三角形内部实现的细节 内部实现的细节变成了接口的一部分 三角形类接口不再简洁明了 以后你如果想修改三角形的内部数据结构这几乎不可能因为外部代码也要跟着改涉及的外部程序和修改点可能太多 --- 这种复杂的情况我们称之为紧耦合 - tight coupling。而程序的松散耦合 - loose coupling才是我们的目标。#Shapes.py...t1 Triangle()t2 Triangle()c1 Circle()c2 Circle()p1 Paragraph()#doc模拟一个文档将界面元素组织在列表中doc [p1,c2,t2,c1,t1]#遍历全部界面元素将它们全部画出来def renderDocument(doc): for x in doc: x.draw()renderDocument(doc)执行结果Paragraph::drawCircle::drawTriangle::drawCircle::drawTriangle::draw在这段代码里我们创建了两个三角形两个圆形一个段落 然后把它们放入一个列表中这个列表就是一个文档的简化表达形式。renderDocument()函数遍历这个列表逐一执行其元素的draw()方法。我们看到renderDocument()函数并不清楚变量x的具体类型它只认为x是一个Shape实现了draw()方法至于x到底是三角形、圆形或者别的什么界面元素完全不关心。但是我们发现x是什么类型就会执行什么类型的对应的draw()函数并打印出对应的文字。这就是多态这些变量类型未知但自动展现出与类型对应的恰当行为。作为初学者的你看见这个觉得平淡无奇 这不就是我想像的样子么 是的这正好说明Python语言的设计目标达到了它几乎总是按你的设想来工作。但这样做是有代价的代价之一就是执行效率低。在C这种讲究效率的语言里为了追求效率多态不是默认的。本节展示的类结构为程序的扩展提供了无限的可能及便利。如果Office软件试图建立一种全新的界面元素比如某种直方图图表软件设计者所要做的就是继承Shape类并设计一个新的类然后在新的类里实现全部抽象函数。然后上述renderDocument()函数一个字符都不用修改即可以拥抱新的界面元素的加入所带来的变化以不变应万变
http://www.zqtcl.cn/news/524372/

相关文章:

  • 网站建站行业新闻微盟开店怎么收费
  • 网站的建设参考文献郑州网站建设中国建设建设银行
  • 重庆那些公司的网站是网易做的电信100m光纤做网站
  • 网站怎么设计产品营销策略包括哪些内容
  • 天元建设集团有限公司破产重组河源seo排名
  • 网站权重什么意思seo的搜索排名影响因素有
  • 建设报名系统是正规网站吗计算机培训班出来好找工作吗
  • 网站上的文章用秀米可以做吗宁波外客网络科技有限公司
  • 网站底部导航代码成品视频直播软件推荐哪个好一点ios
  • 上海电商网站开发公司垫江网站建设价格
  • 门户网站建设存在问题与不足商城网站开发项目文档
  • wordpress建站方便吗wordpress加入海报功能
  • 网站名称注册保护2018wordpress主题
  • 类似享设计的网站企业信息系统公示
  • 如何学习网站开发酒店网站源码
  • 怎么用nas做网站服务器WordPress云虚拟空间
  • 网站设计 ipad企业品牌推广宣传方案
  • 织梦网站怎么更换模板济南建设厅网站
  • 用wordpress仿站专业做俄语网站建设司
  • 做暧暧网站网站开发 思维导图
  • asp.net做登录注册网站苏醒的wordpress主题怎么样
  • 正能量不良网站推荐2020网站建设单位是什么
  • 固镇网站建设郑州网站seo顾问
  • 新建定制网站费用公司网站手机端和电脑端
  • 网站域名注册地址苏州建设培训中心网站
  • 高端娱乐网站建设沈阳seo专业培训
  • 做播放器电影网站需要多少钱6广州seo公司推荐
  • 笔记本可以做网站吗怎样查看网站是否备案
  • 千灯做网站网站静态和伪静态意思
  • 做境外碎片化旅游的网站wordpress wdcp