########################总结################

面向对象回顾

  类:对某一个事物的描述,对一些属性和方法的归类

  1. class 类名:
  2. var=123#类变量
  3.  
  4. def __init__(self,x,x,x)#实例变量
  5. self.xxx=xxx
  6. self.xxx=xxx
  7. self.xxx=xxx
  8. #实例方法:给对象用的
  9. def method(self):
  10. pass
  11. @staticmethod():--函数
  12. def stsmethod():
  13. pass
  14. @classmethod--方法
  15. def clsmethod(cls):
  16. pass
  17. @property
  18. def age(self):#把一个方法变成属性
  19. retun 10
  20. def __privatemethod(slef):私有方法
  21. pass
  22. 类可以互相继承
  23. class Base:#超类 基类
  24. pass
  25. class Person(Base,Base2):#派生类
  26. pass
  27.  
  28. 约束
  29. 1.写一个父类,在父类中写出要被约束的方法,
  30. raise NotImplmentedError()
  31. 2.写一个抽象类,子类重写抽象类中的抽象方法
  32. from abc import ABCMeta,abstractmethod
  33. class Foo(metclass=ABCMeta):
  34. @abstractmethod
  35. def 抽象方法(self):
  36. pass
  37. 反射
  38. getattr(对象,str)
  39. hasattr(对象,str)
  40. setattr(对象,strt,value)
  41. delattr(对象,strt)

2. 明白对象是什么
什么是对象, 什么都是对象.
在编程的世界里. 对象是由类创建.
类名() -> 创建对象, 实例化
此时会默认的调用两个方法 -> __new__()开辟内存 -> __init__()
对象能够执行的方法都写在类中. 对象的属性一般都写在__init__()

  1.  

对象最主要的意义就是对数据进行封装.

class Stu:

  def __init__(self, name, sno, age):
    self.name = name
    self.sno = sno
    self.age = age

  1.  

bb = Stu("宝宝", "1", 18)

python 在2.4之前使用的是经典类  2.4之后使用新式类

经典类的mro 树形结构深度优先遍历

从左往右 一条道走到黑

  1. class A:
  2.   pass
  3. class B(A):
  4.   pass
  5. class C(A):
  6.   pass
  7. class D(B,C):
  8.   pass
  9. class E(C,A):
  10.   pass
  11. class F(D,E):
  12.   pass
  13. class G(E):
  14.   pass
  15. class H(G,F):
  16.   pass
  17.  
  18. #加法 merge()
  19. 拿第一项和后面每项的第一位比较,如果没有则计算出
  20. 如果出现了,此时开始下一项的第一位
  21. 头和身体的比较

  22. 新式类的mor C3算法
  23. L(H)= H +L(G)+L(F)+GF h+geca+fdbeca =hgfdbeca
  24. L(G)= G +L(E)+E g+eca+e =geca
  25. L(F)= F +L(D)+L(E)+DE f+dbca+eca+de =fdbeca
  26. L(E)= e +l(C)+L(A)+CA e+ca+a+ca =eca
  27. L(D)= D +L(B)+L(C)+BC D+ba+ca+bc =dbca 比到c的时候第二位没有就写上
  28. L(C)= C +L(A)+A ca
  29. L(B)= B +L(A)+A ba
  30. L(A)= A
  31.  
  32. print(H.__mro__)

super() 找MRO顺序的下一个

  1. class Base1:
  2. def chi(self):
  3. print("我是可怜的Base1")
  4.  
  5. class Base2:
  6. def chi(self):
  7. print("我是可怜的Base2")
  8.  
  9. class Base3:
  10. def chi(self):
  11. print("我是可怜的Base3")
  12.  
  13. class Bar(Base1, Base2, Base3):
  14. def chi(self):
  15. print("我是Bar里面的吃1")
  16. # super(类名, self) 从某个类开始找下一个MRO
  17. super(Base2, self).chi() # 此时调用的super. 在Bar调用 -> super表示找MRO里的下一个
  18. # super().chi() # super(Bar, self).chi()
  19. print("我是Bar里面的吃2")
  20.  
  21. b = Bar() # Bar, Base1, Base2, Base3, object
  22. b.chi()
  23. print(Bar.__mro__)
  24.  
  25. ###################结果#################

我是Bar里面的吃1
我是可怜的Base3
我是Bar里面的吃2
(<class '__main__.Bar'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class '__main__.Base3'>, <class 'object'>)

############一道 面试题###########

  1. # MRO + super 面试题
  2. class Init(object):
  3. def __init__(self, v): #
  4. print("init")
  5. self.val = v
  6.  
  7. class Add2(Init):
  8. def __init__(self, val): #
  9. print("Add2")
  10. super(Add2, self).__init__(val) # Mult
  11. print(self.val)
  12. self.val += 2
  13.  
  14. class Mult(Init):
  15. def __init__(self, val):
  16. print("Mult")
  17. super(Mult, self).__init__(val) # Haha
  18. self.val *= 5
  19.  
  20. class HaHa(Init):
  21. def __init__(self, val):
  22. print("哈哈")
  23. super(HaHa, self).__init__(val) # Init
  24. self.val /= 5
  25.  
  26. class Pro(Add2,Mult,HaHa): #
  27. pass
  28.  
  29. class Incr(Pro): #
  30. def __init__(self, val): #
  31. super(Incr, self).__init__(val) # Add2
  32. self.val += 1
  33.  
  34. p = Incr(5)
    print(p.val)
    c=Add2(2)
    print(v.cal)

先算mro

  1. L(Incr)=Incr+l(Pro)+Pro Incr+pro,Add2,Mult,HaHa,init+Pro 结果Incr+pro+Add2,Mult,HaHa,init
  2. L(Pro)=Pro+l(Add2)+l(Mult)+l(HaHa)+Add2+Mult+HaHa #因为Add2,Mult,HaHa继承的都是init
  3. L(Pro)=Pro+Add2,init+Mult,init+HaHa,init+Add2,Mult,HaHa 计算结果:pro,Add2,Mult,HaHa,init
  4.  
  5. # p = Incr(5) # p.val = 8.0
  6. # # Add2
  7. # # Mult
  8. # # 哈哈
  9. # # init
  10. # # 5.0
  11. # # 8.0
  12. # print(p.val)
  13. #
  14. c = Add2(2) # Add2, Init, Object c.val = 2
  15. # Add2
  16. # init
  17. # 2
  18. # 4

python 面向对象(六)MRO C3算法 super的更多相关文章

  1. day19 MRO C3算法 super()

    1. MRO(Method Resolution Order):方法解析顺序,主要用于在多继承时判断调的属性的路径(来自于哪个类). 1.Python语言包含了很多优秀的特性,其中多重继承就是其中之一 ...

  2. MRO C3算法 super的运用

    -------------态度决定成败,无论情况好坏,都要抱着积极的态度,莫让沮丧取代热心.生命可以价值极高,也可以一无是处,随你怎么去选择.# --------------------------- ...

  3. python学习笔记:第20天 多继承、MRO C3算法

    目录 一.多继承 二.旧式类的MRO 三.新式类的MRO 四.super 一.多继承 之前已经学习过了继承,当出现了x是⼀种y的的时候,就可以使⽤继承关系,即"is-a" 关系.在 ...

  4. 面向对象多继承(c3算法)、网络基础和编写网络相关的程序

    一.面向对象多继承(c3算法) a.有多个父类先找左,再找右,如下示例: class A(object): pass class B(object): def f1(self): print('B') ...

  5. 面向对象多继承(C3算法)/网络编程

    https://www.cnblogs.com/aylin/p/5572104.html 一.面向对象多继承(c3算法) a.有多个父类先找左,再找右,如下示例: class A(object): p ...

  6. MRO,C3算法

    1了解python2和python3类的区别 python2在2.4之前使用的是经典类, 2.4之后, 使用的是新式类 class Foo: pass class Foo(object): pass ...

  7. python --- 21 MRO C3算法

    一.python2.2之前用的是   经典类的MRO继承 ①深度递归继承     从左到右 ,一条路走到黑 ②广度继承           一层一层的继承 深度继承时   为   R 1 2 3 4 ...

  8. python中多继承C3算法研究

    在python的面向对象继承问题中,单继承简单易懂,全部接受传承类的属性,并可添加自带属性, 但是,在多继承情况下,会遇到多个被继承者的顺序问题,以及多次继承后查找前几次继承者需求属性时,可能不易发现 ...

  9. 21 MRO C3算法

    三十九 MRO 多继承的继承顺序 一.python2.2之前用的是   经典类的MRO继承 ①深度递归继承     从左到右 ,一条路走到黑 ②广度继承           一层一层的继承 深度继承时 ...

随机推荐

  1. Listview 包含 edittext 的解决方案

    转载:https://blog.csdn.net/qq_28268507/article/details/53666576 一. 前几天在群里聊天,碰到一个哥们问listview的itemview中包 ...

  2. 用递归方法计算斐波那契数列(Recursion Fibonacci Sequence Python)

    先科普一下什么叫斐波那契数列,以下内容摘自百度百科: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因意大利数学家列昂纳多·斐波那契(Leonardoda Fibonacci ...

  3. Gulp 新手使用

    Gulp 注意:gulp依赖于nodejs,在安装前要确保已经安装node环境,如为安装查看<windows系统下nodejs安装及环境配置>安装node环境. 1.全局安装 在命令行执行 ...

  4. CF280C Game on Tree

    题目链接 : CF280C Game on Tree 题意 : 给定一棵n个节点的树T 根为一(我咕的翻译漏掉了...) 每次随机选择一个未被删除的点 并将它的子树删除 求删整棵树的期望步数 n ∈ ...

  5. 网络文件系统(NFS)简介

    网络文件系统(Network File System, NFS)是一种分布式文件系统协议,最初由Sun Microsystems公司开发,并于1984年发布.其功能旨在允许客户端主机可以像访问本地存储 ...

  6. Android ListView item 点击事件失效问题的解决

    关于ListView点击无效,item无法相应点击事件的问题,网上有很多, 大致可分为俩种情况, 一种是 item中存在 ImageButton 等可以点击的组件,这会抢先获得ListView的焦点. ...

  7. 【BZOJ5213】[ZJOI2018]迷宫(神仙题)

    [BZOJ5213][ZJOI2018]迷宫(神仙题) 题面 BZOJ 洛谷 题解 首先可以很容易的得到一个\(K\)个点的答案. 构建\(K\)个点分别表示\(mod\ K\)的余数.那么点\(i\ ...

  8. 【原创】hdu1698 Just a Hook(线段树→区间更新,区间查询)

    学习线段树第二天,这道题属于第二简单的线段树,第一简单是单点更新,这个属于区间更新. 区间更新就是lazy思想,我来按照自己浅薄的理解谈谈lazy思想: 就是在数据结构中,树形结构可以线性存储(线性表 ...

  9. NOIP2015斗地主(搜索+模拟+贪心)

    %%%Luan 题面就不说了,和斗地主一样,给一组牌,求最少打几次. 注意一点,数据随机,这样我们瞎搞一搞就可以过,虽然直接贪心可以证明是错的. 枚举方法,每次搜索按照(三顺子>二顺子>普 ...

  10. Spring Cloud Vault介绍

    https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247484838&idx=1&sn=6439ed96133dde ...