首页 > 编程语言 >巨蟒python全栈开发-第21天 继承

巨蟒python全栈开发-第21天 继承

时间:2022-11-14 12:06:06浏览次数:44  
标签:21 val python chi self passclass 全栈 print super

一.今日主要内容

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

 

巨蟒python全栈开发-第21天 继承_python

结果:

#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
# 2
# 4

'''

MRO: method resolution order #方法查找顺序
Incr,Pro,Add2,Mult,HaHa,Init,Object

'''

 



标签:21,val,python,chi,self,passclass,全栈,print,super
From: https://blog.51cto.com/u_11182673/5848791

相关文章

  • 巨蟒python全栈开发linux之cento9
    1.docker入门学习查看机器中已经启动的所有的进程.ps-ef 2.docker常用命令学习3.docker学习34.dockerfile与镜像5.docker私有仓库6.rabbitmq介绍与安装7.rabbitmq的队......
  • 开发笔记 -- URL地址格式显示异常-用python-urllib库解决1
    场景描述:开发中,尤其数据采集过程中,偶尔会遇到URL地址显示异常的情况,如下:https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp6.itc.cn%2Fq_70%2Fimages03%2F......
  • Python如何研究类、对象、方法、函数之间的关系
    1,从某个类或对象出发,研究其上级父类,下级子类,同级类。自身类内部的函数和变量2,上级类base,下级类subclasses方法,同级类需要先上后下。3,查看某个类和对象支持哪些变量使用di......
  • 搭建python远程解释器
    背景python项目是flask项目,因一些包不支持windows,需要一个集中linux开发环境。公司使用K8S,没有多余CVM步骤使用VirtualBox+Vagrant创建虚拟机VirtualBox:5.2.4......
  • Python 常用库
    API文档NumPy:https://www.numpy.org.cn/reference/SciPy:   https://docs.scipy.org/doc/scipy/reference/index.html#Matplotlib:  http://matplotlib.org/......
  • 今日笔记之20221114
    1.vue中刷新页面,echarts图表不显示问题? <divid="myChart"></div><script>exportdefault{data(){return{myChart:{}}},mounted:{this.init......
  • python-介绍-笔记
    因为c语言的数据结构实在是看不懂,所以转而学习python了,等后续回过头来再看数据结构吧。目前先把python的基础内容学习完,顺便总结一下近期的学习笔记,和大家分享。认识Python......
  • python-注释-笔记
    注释目标注释的作用单行注释(行注释)多行注释(块注释)01.注释的作用使用用自己熟悉的语言,在程序中对某些代码进行标注说明,增强程序的可读性02.单行注释(行注释)以#开头,#右......
  • python-循环-笔记
    循环目标程序的三大流程while循环基本使用break和continuewhile循环嵌套01.程序的三大流程在程序开发中,一共有三种流程方式:顺序——从上向下,顺序执行代码分支——......
  • python-函数基础-笔记
    函数基础目标函数的快速体验函数的基本使用函数的参数函数的返回值函数的嵌套调用在模块中定义函数01.函数的快速体验1.1快速体验所谓函数,就是把具有独立功能的代码块组......