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

面向对象回顾

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

class 类名:
var=123#类变量 def __init__(self,x,x,x)#实例变量
self.xxx=xxx
self.xxx=xxx
self.xxx=xxx
#实例方法:给对象用的
def method(self):
pass
@staticmethod():--函数
def stsmethod():
pass
@classmethod--方法
def clsmethod(cls):
pass
@property
def age(self):#把一个方法变成属性
retun 10
def __privatemethod(slef):私有方法
pass
类可以互相继承
class Base:#超类 基类
pass
class Person(Base,Base2):#派生类
pass 约束
1.写一个父类,在父类中写出要被约束的方法,
raise NotImplmentedError()
2.写一个抽象类,子类重写抽象类中的抽象方法
from abc import ABCMeta,abstractmethod
class Foo(metclass=ABCMeta):
@abstractmethod
def 抽象方法(self):
pass
反射
getattr(对象,str)
hasattr(对象,str)
setattr(对象,strt,value)
delattr(对象,strt)

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


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

class Stu:

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


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

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

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

从左往右 一条道走到黑

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 G(E):
  pass
class H(G,F):
  pass #加法 merge()
拿第一项和后面每项的第一位比较,如果没有则计算出
如果出现了,此时开始下一项的第一位
头和身体的比较

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

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__) ###################结果#################

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

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

# MRO + super 面试题
class Init(object):
def __init__(self, v): #
print("init")
self.val = v class Add2(Init):
def __init__(self, val): #
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): #
def __init__(self, val): #
super(Incr, self).__init__(val) # Add2
self.val += 1 p = Incr(5)
print(p.val)
c=Add2(2)
print(v.cal)

先算mro

L(Incr)=Incr+l(Pro)+Pro  Incr+pro,Add2,Mult,HaHa,init+Pro  结果Incr+pro+Add2,Mult,HaHa,init
L(Pro)=Pro+l(Add2)+l(Mult)+l(HaHa)+Add2+Mult+HaHa #因为Add2,Mult,HaHa继承的都是init
L(Pro)=Pro+Add2,init+Mult,init+HaHa,init+Add2,Mult,HaHa 计算结果: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

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. 自定义Wed框架

    Wed框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义wed框架 impor ...

  2. Tarjan求强连通分量,缩点,割点

    Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...

  3. 【XSY1081】随机存储器 网络流

    题目描述 Bob有\(2^n\)字节的内存,编号为\([0,2^n-1)\).他想对每个字节的内存分别分配一个值.对于编号为\(i\)的内存,如果它被分配了一个值\(j(0\leq j<2^m) ...

  4. MT【300】余弦的三倍角公式

    2017清华大学THUSSAT附加学科测试数学(二测)$\cos^5\dfrac{\pi}{9}+\cos^5\dfrac{5\pi}{9}+\cos^5\dfrac{7\pi}{9}$ 的值为___ ...

  5. android startActivityForResult 使用实例

    ActivityForResult.java public class ActivityForResult extends Activity { Button bn; EditText city; @ ...

  6. 【转】Ubuntu 64位系统安装交叉编译环境一直提醒 没有那个文件或目录

    安装交叉编译环境搞了一个晚上 一直提示 root@zqs-pc:~# arm-linux-gcc/usr/local/arm/4.3.2/bin/arm-linux-gcc: 行 3: /usr/lo ...

  7. Docker部署SonarQube

    依赖 CentOS 7.2+ docker 1.13+ docker-compose 1.20+ 将下面文件内容另存为docker-compose.yml文件,执行docker-compose up ...

  8. 2018蓝桥杯 省赛B题(明码)

    标题:明码汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛.16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中.一个字节可以存储8位信息,用32个字节就可以存 ...

  9. webpack入门(三)webpack的api

    终于到了webpack api这一篇,我都等不及了0.0; webpack is fed a configuration object. Depending on your usage of webp ...

  10. tyvj/joyoi 1305 最大子序和

    带了一个转化的单调队列裸题. 转化为前缀和相减即可. 有一点需要注意:从0开始入队而不是1,因为要统计第一个. (从网上找的对拍程序,结果别人写错了) /** freopen("in.in& ...