1.了解Python2和python3类的区别:
  python2.3之前使用的是经典类, 在2.3版本之后组,使用的是新式类
MRO: method resolution order  方法的查找顺序
MRO: method resolution order 方法的查找顺序
 
        class Base:
            pass
 
        class Base1:
            def chi():
                pass
 
        class Bar(Base, Base1):
            pass
 
        b = Bar() # Bar -> Base -> Base1
        b.chi()
2.经典类的MRO  树形结构的深度优先遍历   -> 树形结构遍历
注意:新式类的不是广度的遍历
3.新式类的MRO  c3算法(重点,难点)
    1.拆分
     2.合并
用头和身体进行比较,如果头在身子里面存在,取身子的头,如果头在身子里面不存在,取头
class A:
    pass
class B(A):
    pass
class C(A):
    pass
class D(B, C):
    pass
class E(C, A):
    pass
class F(D, E):
    pass
class M:
    pass
class N(M):
    pass
class P(E, A):
    pass
class X:
    pass
class Q(P,N,X):
    pass
class G(Q, F):
    pass
class H(G, F):
    pass
 
'''
L(H) = H + L(G) + L(F) + GF # HGQPFDBECANMX
L(G) = G + L(Q) + L(F) + QF # GQPFDBECANMX
L(Q) = Q + L(P) + L(N) + X + PNX # QPECANMX
L(P) = P + L(E) + A + EA  # PECA
L(E) = E + L(C) + A + CA   # ECA
L(C) = C + A + A   # CA
L(N) = N + M # NM
 
L(F) = F + L(D) + L(E) + DE # FDBECA
L(D) = D + L(B) + L(C) + BC # DBCA
 
 
'''
 
'''
    求H的MRO
    设求MRO的算法是L
    L(H) = H + L(G) + L(F) + GF
    L(G) = G + L(E) + E
    L(E) = E + L(C) + L(A) + CA
    L(C) = C + L(A) + A
    L(A) = A
    L(F) = F + L(D) + L(E) + DE
    L(D) = D + L(B) + L(C) + BC
    L(B) = B + L(A) + A
 
    # 加法:merge(), 拿第一项的第一位和 后面每项的除了第一位比较. 如果没有出现, 则该位元素算出
        如果出现了. 此时开始下一项的第一位继续和后面每一项的除了第一位比较:
        
        用头和后面身体比较
            
    L(H) = H + L(G) + L(F) + GF # ECA + DBECA  = HGFDBECAO
    L(G) = G + L(E) + E # GECA
    L(E) = E + L(C) + L(A) + CA # ECA
    L(C) = C + L(A) + A  # CA
    L(A) = A
    L(F) = F + L(D) + L(E) + DE # FDBECA
    L(D) = D + L(B) + L(C) + BC # DBCA
    L(B) = B + A + A   # BA
'''
print(H.__mro__)
4.super() 找MRO顺序的下一个
class Base1:
    def chi(self):
        print("我是可怜的Base1")
 
class Base2:
    def chi(self):
        print("我是可怜的Base2")
 
class Base3:
    def chi(self):
        print("我是可怜的Base3")
 
class Bar(Base1, Base2, Base3):
    def chi(self):
        print("我是Bar里面的吃1")
        # super(类名, self) 从某个类开始找下一个MRO
        super(Base2, self).chi() # 此时调用的super. 在Bar调用 -> super表示找MRO里的下一个
        # super().chi() # super(Bar, self).chi()
        print("我是Bar里面的吃2")
 
b = Bar() # Bar, Base1, Base2, Base3, object   顺序
b.chi()
print(Bar.__mro__)
5.一道面试题
# MRO + super ⾯试题
class Init(object):
    def __init__(self, v): # 2
        print("init")
        self.val = v
 
class Add2(Init):
    def __init__(self, val): # 2
        print("Add2")
        super(Add2, self).__init__(val) # Mult
        print(self.val)
        self.val += 2
 
class Mult(Init):
    def __init__(self, val):
        print("Mult")
        super(Mult, self).__init__(val) # Haha
        self.val *= 5
 
class HaHa(Init):
   def __init__(self, val):
        print("哈哈")
        super(HaHa, self).__init__(val) # Init
        self.val /= 5
 
class Pro(Add2,Mult,HaHa): #
    pass
 
class Incr(Pro): # incr->pro->add2->Mult->HaHa->init
    def __init__(self, val): # 5
        super(Incr, self).__init__(val) # Add2
        self.val += 1
 
 
 
'''
MRO: method resolution order
Incr,Pro,Add2,Mult,HaHa,Init,Object
 
super()
a = Incr()
a.chi()
'''
 
# print(Incr.__mro__)
# Incr Pro Add2 Mult HaHa Init
p = Incr(5) # p.val = 8.0
# Add2
# Mult
# 哈哈
# init
# 5.0
# 8.0
print(p.val)
 
c = Add2(2) # Add2, Init, Object c.val = 2
# Add2
# init
# 2
# 4
 
print(c.val) # 4
 

day 21继承的更多相关文章

  1. python 之 面向对象基础(继承与派生,经典类与新式类)

    7.2 继承与派生 7.21继承 1.什么是继承? 继承是一种新建类的的方式,在python中支持一个子类继承多个父类.新建的类称为子类或者派生类,父类又可以称为基类或者超类,子类会”遗传“父类的属性 ...

  2. 线程和线程池的理解与java简单例子

    1.线程 (1)理解,线程是系统分配处理器时间资源的基本单元也是系统调用的基本单位,简单理解就是一个或多个线程组成了一个进程,进程就像爸爸,线程就像儿子,有时候爸爸一个人干不了活就生了几个儿子干活,会 ...

  3. Java自由块(静态和非静态)(转载)

    java中的自由块分为两种: 静态块和非静态块 静态块: public class Test { 2 static int x = 10; 3 //静态块:静态块的执行时机是在class文件装载的时候 ...

  4. [JS] javascript基础语法

    W3CSchool全套Web开发手册:点击下载 1.javascript是什么 js是具有面向对象能力的,解释性的程序设计语言. 2.js的类型 [基本类型]:string number boolea ...

  5. Java知识思维导图

    注:图片来源于网络,谢谢分享. 1 开发环境Java SDK 下载和安装2 环境变量的配置(path和classpath)3 编程基础 标识符命名规范4 Java数据类型5 运算符6 分支语句(if, ...

  6. JavaSE_ 面向对象 总目录(7~10)

    JavaSE学习总结第07天_面向对象2 07.01 成员变量和局部变量的区别07.02 方法的形式参数是类名的调用07.03 匿名对象的概述和应用07.04 封装的概述07.05 封装的好处和设计原 ...

  7. JavaSE学习总结第08天_面向对象3

      08.01 工具类中使用静态 例: class ArrayTool { //将构造方法私有,外界不能创建该类的对象 private ArrayTool(){} //遍历数组 public stat ...

  8. J2SE学习笔记

    如何学习Java 一.面向对象设计思想 1.面向对象:开车去新疆,车怎么去的我不管,我只调用车的go() 方法即可. 2.类和对象:类可以看成一类对象的模板,对象可以看成该类的一个具体实例. 3.类和 ...

  9. 面向对象的Java实现

    1.面向对象的Java实现--封装 1-1:封装 a.为什么需要封装(封装可以是数据方便维护.增加实用性.方便扩展等等.通过面向对象的思想,模拟现实生活中的事物.) b.什么是封装(封装就是将属性私有 ...

随机推荐

  1. 在win7 windows 上编译 beego 上传到 linux 去执行

    在beego的项目目录下,执行: GOOS=linux GOARCH=amd64 go build So easy!但是却搞了好久! 参考连接:http://blog.csdn.net/changji ...

  2. 使用Vaadin的maven archetype创建一个空Vaadin项目

    所在公司要求使用这个臭屎粑粑一样的Vaadin,我也没办法.为了更好地开展工作,对得起老板发给我的工资,就算是臭屎粑粑,也要尽力给他玩儿出花样来. Vaadin针对Eclipse和Netbeans等I ...

  3. Ubuntu16.04更换NVIDIA驱动导致无法进入图形界面的解决方案

    一.进入recovery模式 由于无法进入图形界面,所以需要在开机时进入恢复模式.我的机器上时在开机时通过引导选项中的recovery mode选项进入,进入之后可以看到许多选项卡,选择root,回车 ...

  4. Android(java)学习笔记211:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  5. ResNet 修改

    https://github.com/tornadomeet/ResNet apache 开源项目 修改如下: 训练模块 import argparse,logging,os import mxnet ...

  6. TCP/IP模型 & 5层参考模型

    OSl参考模型与TCP/IP参考模型相同点: 1.都分层 2.基于独立的协议栈的概念 3.可以实现异构网络互联

  7. js 实现图片无限横向滚动效果

    门户网站好多都有产品无线滚动展现的效果: 测试demo1 -- 非无缝滚动(可以看出来从头开始的效果): css样式如下: .box{ width: 1000px; border: 1px solid ...

  8. 面试准备——(二)专业知识(2)Python

    面试遇到的问题: 滴滴: 1. Python的数据结构 2. list和tuple的区别 3. list中有哪些操作?append和extend的区别? 4. list和dict的却别?dict是有序 ...

  9. VC++读写*.ini配置文件

    ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息.ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Ke ...

  10. 解决FileUpload上传大文件报错

    <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedConte ...