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

网站的推广方案怎么写峡山网站建设

网站的推广方案怎么写,峡山网站建设,中国建设银行招聘网站通知,北京网站开发一般多少钱python 中的多态实现非常简单#xff0c;只要是在子类中实现和父类同名的方法#xff0c;便能实现多态#xff0c;如果想在子类中调用父类的方法#xff0c;有多种方法#xff0c;但是当涉及菱形继承等问题是#xff0c;super 就成为了比较好的解决方案。普通继承对于比较…python 中的多态实现非常简单只要是在子类中实现和父类同名的方法便能实现多态如果想在子类中调用父类的方法有多种方法但是当涉及菱形继承等问题是super 就成为了比较好的解决方案。普通继承对于比较简单的继承关系通常在子类中有两种方法来执行父类的方法示例如下。基类123class Base(object):def __init__(self):print(init Base)示例 11234567class A(Base):def __init__(self):# 通过父类显式执行Base.__init__(self)print(init A)a A()输出12init Baseinit A示例 21234567class B(Base):def __init__(self):# 调用 supersuper(B, self).__init__()print(init B)b B()输出:12init Baseinit B可以看到两种方法都可以调用父类的方法对父类进行初始化。需要注意的是两种方法都要传入 self但是在子类中调用父类的 super 中传入的 self是子类对象。菱形继承当有多重继承特别是菱形继承时这两种方法就有区别了示例如下。示例 11234567891011121314151617181920class Base(object):def __init__(self):print(init Base)class A(Base):def __init__(self):Base.__init__(self)print(init A)class B(Base):def __init__(self):Base.__init__(self)print(init B)class C(A, B):def __init__(self):A.__init__(self)B.__init__(self)print(init C)c C()输出12345init Baseinit Ainit Baseinit Binit C可以看到Base 被 init 了两次至于其缺陷在 C 中就已经讨论过了反正就是不符合我们的预期不想这种实现。C 中通过虚继承解决菱形继承问题在 python 中可以使用 super 规避这种缺陷。示例212345678910111213141516171819class Base(object):def __init__(self):print(init Base)class A(Base):def __init__(self):super(A, self).__init__()print(init A)class B(Base):def __init__(self):super(B, self).__init__()print(init B)class C(A, B):def __init__(self):super(C, self).__init__()print(init C)c C()输出1234init Baseinit Binit Ainit C运行这个新版本后你会发现每个 __init__() 方法只会被调用一次了。为了弄清它的原理我们需要花点时间解释下 python 是如何实现继承的。对于你定义的每一个类python 会计算出一个所谓的方法解析顺序(MRO)列表。 这个 MRO 列表就是一个简单的所有基类的线性顺序表。我们可以看一下 C 的 MRO 表。12C.__mro__(__main__.C, __main__.A, __main__.B, __main__.Base, object)为了实现继承python 会在 MRO 列表上从左到右开始查找基类直到找到第一个匹配这个属性的类为止。而这个 MRO 列表的构造是通过一个 C3 线性化算法来实现的。 我们不去深究这个算法的数学原理它实际上就是合并所有父类的 MRO 列表并遵循如下三条准则子类会先于父类被检查多个父类会根据它们在列表中的顺序被检查如果对下一个类存在两个合法的选择选择第一个父类必须牢记MRO 列表中的类顺序会让你定义的任意类层级关系变得有意义。当使用 super() 函数时python 会在 MRO 列表上继续搜索下一个类(这是一种嵌套实现)。 只要每个重定义的方法统一使用 super() 并只调用它一次 那么控制流最终会遍历完整个 MRO 列表每个方法也只会被调用一次。 这也是为什么在第二个例子中你不会调用两次 Base.__init__() 的原因。换句话说super 调用了次且仅有一次所有的父类。由于 super 递归调用的会继续搜索的特性可能会出现一些意向不到的效果比如下面这个例子12345678910111213141516class A(object):def spam(self):print(A.spam)super(A, self).spam()class B(object):def spam(self):print(B.spam)class C(A, B):passc C()c.spam()C.__mro__输出123A.spamB.spam(__main__.C, __main__.A, __main__.B, object)为啥 c.spam() 会同时调用 A 和 B 的 spam()其实看到 MRO 顺序就明白了首先在 c 的类 C 中查找 spam 方法没有找到就查找 A 中的 spam 方法。调用 A 中的 spam 方法然后遇到 A 的 super 调用继续在 MRO 顺序表中查找 spam 方法。注意这里本来调用了 A 的 spam 就应该返回的但是 super 的存在导致了继续递归。遇到 B 的 spam 方法调用结束。super 的使用对于 python2 和 python3super 的用法有一些区别原因python2 没有默认继承 objectpython3 默认全部继承 object 类都是新式类用法区别python2 super(开始类名self).函数名()python3super().函数名()参考资料
http://www.yutouwan.com/news/429047/

相关文章:

  • 微信小程序怎么删除seo站内优化教程
  • 怎样做pdf电子书下载网站dw网页设计作品简单
  • 企业网站优化的弊端做seo必须有自己网站吗
  • 网站改版做301重定向游戏公司官方网站建设方案
  • 网站开发 ssh 菜鸟太原网站seo外包
  • 珠海集团网站建设报价apache怎么配置网站
  • 电商食品网站建设网站开发公司面试题
  • 网站建立软件办公室设计图片
  • wordpress建博客网站吗创办公司的基本流程
  • .tel域名不可以做网站域名吗天津平台网站建设制作
  • 青岛城阳网站制作怎么用电脑做网站服务器
  • 福建百川建设有限公司网站优化大师免安装版
  • 石家庄专业网站制作公司产品画册
  • 宜昌微网站建设win主机wordpress伪静态
  • 长沙网站seo优化装潢设计培训班学费多少钱
  • 重?c网站开发网站实名认证流程
  • 嘉兴电子商务网站建设余姚建站公司
  • 免费动画模板素材网站织梦网站栏目不能更新
  • 餐饮网站建设网站企业网站包含哪些页面
  • 微信网站制作软件wordpress 图片压缩插件
  • 贵港网站建设动态网站内容导出
  • 昆明网站建设流程外贸建站用什么平台好
  • 文档下载网站 建设国内跨境电商建站系统
  • 飞卢盗版做的最好的网站俄文企业网站建设
  • 机械网站建设中心动漫网站模板设计图
  • 网站开发外包 合同wordpress能做图片站
  • 手机网站建设品牌热搜榜上2023年热门话题
  • 网站建设制作公司知道万维科技三亚兼职网站
  • 网站免费正能量软件下载视频网站开发技能介绍
  • 网站建设销售方面会遇到的问题电子商务推广网站