一.今日主要内容

1.了解python2和python3类的区别
python2在2.2之前使用的是经典类,2.2之后,使用的是新式类
class Foo:
pass
class Foo(object):
pass 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算法(笔试或者面试别人的算法)(难点,重点)(python没有用过广度优先)
(1)拆分
(2)合并 用头和身体比较
4.super() 找MRO顺序的下一个 #只有讲完MRO才能讲
5.一道面试题

二.今日内容大纲:

1.深度递归

2.MRO_C3

3.super

三.今日内容详解:

1.深度递归

class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
class E:
pass
class F(D, E):
pass
class G(F, D):
pass
class I:
pass
class J(B, C):
pass
class K(A):
pass
class H(I, J, K):
pass
class Foo(H, G):
pass

结果:

#FOO=>H=>I=>J=>B=>A=>C=>K=>G=>F=>D=>E

2.MRO_C3

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 (Q+PECA+NM+X+PNX)
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__)

3.super

(1)

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里面的吃')
#super(类名,self) #从某个类开始找下一个MRO
super(Bar,self).chi() #此时调用的super,在Bar调用=>super表示找MRO里的下一个
#super(Base1,self).chi()
#super(Base2,self).chi() b = Bar() #顺序: Bar, Base1, Base2, Base3, object
b.chi()
print(Bar.__mro__)

(2)

class Base1:
def chi(self):
super().chi() # super找的是MRO的下一个.
print("我是可怜的Base1") class Base2:
def chi(self):
super().chi()
print("我是可怜的Base2") class Base3:
def chi(self):
print("我是可怜的Base3") class Bar(Base1, Base2, Base3):
def chi(self):
print("我是Bar里面的吃1")
# super(类名, self) 从某个类开始找下一个MRO
super(Bar, self).chi() # 此时调用的super. 在Bar调用 -> super表示找MRO里的下一个
# super().chi() # super(Bar, self).chi()
print("我是Bar里面的吃2") b = Bar() # 报错 如果是Base1 object,会报错,注意这里的细节
b.chi() # 报错
# 坑

(3)

# MRO + super ⾯试题
class Init(object): #在下面对应子类和父类都可以
def __init__(self,v): #在这里注意解题的标记
print('init') #HaHa
self.val=v
class Add2(Init):
def __init__(self,val):
print('Add2')
super(Add2, self).__init__(val) #Pro
print(self.val)
self.val+=2
class Mult(Init):
def __init__(self,val):
print('Mult')
super(Mult,self).__init__(val) #Add2
self.val*=5
class HaHa(Init):
def __init__(self,val):
print('哈哈')
super(HaHa,self).__init__( val) #Mult
self.val/=5
class Pro(Add2,Mult,HaHa): #Incr
pass
class Incr(Pro): # incr->pro->add2->Mult->HaHa->init
def __init__(self,val):
super(Incr,self).__init__(val) #Add2
self.val+=1
# print(Incr.__mro__) p=Incr(5)
print(p.val)
# Incr Pro Add2 Mult HaHa Init
# p = Incr(5) # p.val = 8.0
'''结果:
# # Add2
# # Mult
# # 哈哈
# # init
# # 5.0
# # 8.0
'''
p=Add2(2)
print(p.val)
# Add2, Init, Object c.val = 2
# Add2
# init
#
# ''' MRO: method resolution order #方法查找顺序
Incr,Pro,Add2,Mult,HaHa,Init,Object '''

巨蟒python全栈开发-第21天 继承的更多相关文章

  1. 巨蟒python全栈开发linux之centos3

    1.作业讲解 (1)递归创建文件夹/tmp/oldboy/python/{alex,wusir,nvshen,xiaofeng} 下面中的路径没有必要换,在哪里创建都行,根目录下或者tmp目录下或者其 ...

  2. 巨蟒python全栈开发linux之centos1

    1.linux服务器介绍 2.linux介绍 3.linux命令学习 linux默认有一个超级用户root,就是linux的皇帝 注意:我的用户名是s18,密码是centos 我们输入密码,点击解锁( ...

  3. 巨蟒python全栈开发-第13天 内置函数 匿名函数lambda

    一.今日内容总览 1.内置函数(1):并不是每一个内置函数都是那么常用 上菜:内置函数部分//思维导图:https://www.processon.com/view/link/5b4ee15be4b0 ...

  4. 巨蟒python全栈开发-第20天 核能来袭-约束 异常处理 MD5 日志处理

    一.今日主要内容 1.类的约束(对下面人的代码进行限制;项目经理的必备技能,要想走的长远) (1)写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError(重点) (2)抽象 ...

  5. 巨蟒python全栈开发-第22天 内置常用模块1

    一.今日主要内容 1.简单了解模块 你写的每一个py文件都是一个模块 数据结构(队列,栈(重点)) 还有一些我们一直在使用的模块 buildins 内置模块.print,input random 主要 ...

  6. 巨蟒python全栈开发linux之centos6

    1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...

  7. 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查

    内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...

  8. 巨蟒python全栈开发-第11阶段 ansible_project3

    今日大纲: 1.用户创建 2.前端优化 3.用户编辑 4.用户删除 5.ansible api介绍 1.用户创建 新建一个user_create.html的页面 <form class=&quo ...

  9. 巨蟒python全栈开发-第11阶段 ansible_project2

    一个NB的网站: https://www.toolfk.com/ CDN:将用户的需求送到最近的节点:内容分发网络 有些是专门做CDN的工具 常用的markdown是需要知道的,短信有字数限制. we ...

随机推荐

  1. python-创建列表

    创建个空列表 album = [] 创建非空列表 album = ['Black Star','David Bowie',25.True] 向列表中添加新的元素 append 方法,元素自动地排列到列 ...

  2. sklearn 中模型保存的两种方法

    一. sklearn中提供了高效的模型持久化模块joblib,将模型保存至硬盘. from sklearn.externals import joblib #lr是一个LogisticRegressi ...

  3. 深入Activity

    此刻,你应该静下心来,在阅读中思考.在思考中进步,读完本篇文章的你一定会有不一样的收获,请让我们共同进步! 核心内容 1.Activity数据交换 2.Activity中的任务栈 3.Activity ...

  4. The server has either erred or is incapable of performing the requested operation. (HTTP 500)

    感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免,欢迎指正. 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...

  5. Atitit 《摩奴法典》overivew 读后感 不是由国王 颁布的,而是 僧侣编制

    Atitit <摩奴法典>overivew 读后感 不是由国王 颁布的,而是 僧侣编制 1. <摩奴法典>是印度最古老的一部法律文献.该法典不是由国王或立法机关制定颁布的,而是 ...

  6. HDU 4969 Just a Joke(积分)

    HDU 4969 Just a Joke pid=4969" target="_blank" style="">题目链接 推公式,r′=dr/d ...

  7. C/C++ 错误笔记-解决swap函数与标准库的std::swap函数冲突的问题

    下午写了一份代码: #include <iostream> using namespace std; // 模板1:交换基本类型的值 template<typename T> ...

  8. ListView嵌套GridView使用详解及注意事项

    ListView嵌套GridView即ListView的每个Item中都包含一个GridView:需要注意的是由于ListView和GridView都是可滑动的控件. 所以需要自定义GridView, ...

  9. linux查看硬盘空间 文件大小

    du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有被删除的.他计算的大小就是当前他认为存在的所有文件大小的累加和 df,disk free ...

  10. 简单解决Ubuntu修改locale的问题

      本文针对的问题是“Ubuntu 安装中文语言包”“Ubuntu Server中文问题”,“Ubuntu更改语言环境”,“Ubuntu locale的设定”,“cannot change local ...