面向对象三大特性-继承2

资源的使用:

        1.继承的集中形态:

                单继承链:先从A自身->再找B->再找C。

                无重叠的多继承链:现在A自身找->然后找B->然后找D->然后找C->然后找E

                有重叠的多继承链:先再A自身找->然后找B->然后找C->最后找D

 

        2.集中形态应该遵循的标准原则:

        3.针对几种标准原则的方案演化:

                python2.2之前:仅仅存在经典类;MRO原则:深度优先(从左往右);问题:有重叠的多继承中,违背了重写可用原则。

                python2.2:产生了新式类;MRO原则:经典类,深度优先(从左往右)。新式类,在深度优先(从左往右)的算法基础上,优化了一部分(如果产生了重复元素,会保留最后一个。并且,更尊重基类出现的先后顺序。)。注意:这并不是广度优先算法;问题:无法检测出有问题的继承。有可能还会违背“局部优先”的原则。

                                    例如:

                python2.3-2.7:新式类与经典类共存

                                            MRO原则:经典类:深度优先(从左到右);新式类:C3算法。

                python3.x之后:MRO原则:只存在新式类:C3算法。

                概念补充:MRO(Method Resolution Order),方法解析顺序

                深度优先:沿着一个继承链,尽可能的往深里去找

                                   具体算法步骤:1.把根节点压入栈中->2.每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中(发现已经被处理过,则略过)->3.重复第2个步骤到结束为止。

                广度优先:沿着继承链,尽可能的往宽了去找。

                                   具体算法步骤:1.把根节点放到队列的末尾->2.每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把他们放到队列的末尾。(发现已经被处理过,则略过)->3.重复上面的步骤。

                C3算法:真正步骤:两个公式L(object) = [object]

                                                                     L(子类(父类1, 父类2)) = [子类] + merge(L(父类1), L(父类2), [父类1, 父类2])

                                 注意:+代表合并列表

                                             merge算法:1.第一个列表的第一个元素,是后续列表的第一个元素,或者后续列表中没有再次出现。则将这个元素合并到最终的解析列表中,并从当前操作的列表中删除。->2.如果不符合,则跳过此元素,查找下一个列表的第一个元素,重复1的判断规则。->3.如果最终无法把所有的元素归并到解析列表,则报错。

                                  类似拓扑排序,但并不是!切记:

查看继承顺序的三种方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值