021-2018-0930 C3算法和Super

1.今日内容大纲

一. 昨日内容回顾
    1. 异常处理
        raise: 抛出异常.
        try:
            可能会出现错误的代码
        except 异常类 as e:
            异常的处理
        except 异常类 as e:
            异常的处理
        except 异常类 as e:
            异常的处理
        except 异常类 as e:
            异常的处理
        else:
            如果上面的代码没有错误, 执行这里的代码
        finally:
            收尾

        自定义异常: 随便写个类. 继承Exception
    2. 约束
        父类和子类.
            在父类中声明方法. 要求子类必须重写它
        1. 抛出异常. raise NotImplementError
        2. 抽象类和抽象方法
            from abc import ABCMeta,  abstractmethod
            在父类声明的时候,  metaclass= ABCMeta
            方法上面加@abstractmethod
            子类必须重写这个抽象方法.

            接口: 定义方法和约束子类
    3. M5D
        1. 引入模块
        import hashlib
        2. 创建md5对象(实例化)
        obj = hashlib.md5(b"盐")
        3. 把加密的内容交给md5
        obj.update(bytes)
        4. 获取密文
        obj.hexdigest()
    4. 日志
        logging模块
        basicConfig
            filename
            format
            datefmt
            level 级别
                CRITICAL  50
                ERROR     40
                WARNING   30
                INFO      20
                DEBUG     10
                NOTEST    0


二. 作业

三. 今日主要内容
    一. python的继承. 多继承
        子类继承父类.
        为什么要继承???? 为了节省开发时间. 调高开发效率. 代码得到了重用
        在python中存在多继承

        MRO(method resolution Order) 方法路径顺序.
            python2
                1. 使用经典类(写继承关系的时候. 基类不继承object)
                2. 新式类(继承关系的根. 是object)
            python3
                只有新式类

    二. 经典类的MRO
        经典类的MRO使用的是深度优先遍历

    三. 新式类的MRO, C3(重点, 难点)
        新式类中摒弃了(部分)旧的深度优先算法. 使用C3算法
        如果你的继承关系中没有菱形继承( 深度优先就够了)
        如果有菱形: 使用C3算法来计算MRO
        假设C3算法. L(x) 表示 x的继承关系
        先拆分。 拆到你能看出结果为止. 反着进行merge()运算
            合并 - 归并
            merge(元组, 元组, 元组,。。。。。。。)

            摘头。
            头和尾在比对,如果下一个尾没有这个头, 头就出现.  如果头在后面的尾出现. 跳过该元组. 继续下一个头. 直到最后一个元组. 根自己匹配

    四. super是神马玩意
        super可以访问MRO列表中的下一个类中的内容. 找父类

    五. 一道面试题

    十一作业:
        完成学生选课
        整理面向对象所学的内容
        预习: 模块(os,sys,time)

        后续的课程: 网络, 并发


2.继承

# class JiaoFu:
#     def qd(self):
#         print("教父带你祈祷")
# class Fu:
#     def msj(self):
#         print("alex喜欢msj")
#
# class Zi(Fu, JiaoFu):
#     def dbj(self):
#         print("刘伟喜欢大宝剑")
#
# z = Zi()
# z.msj()
# z.dbj()
# z.qd()

#
# class Base1: # Base1 object
#     def func(self):
#         print("娃哈哈")
#
#
# class Base2:
#     def func(self):
#         print("雪碧")
#
# class Foo(Base1, Base2): # Foo, Base1, Base2
#     pass
#
# f = Base1()
# f.func() # 雪碧, 娃哈哈

# class A:
#     pass
#
# class B:
#     pass
#
# class C:
#     pass
#
# class D:
#     pass
#
# class E(A, C):
#     pass
#
# class F(B, D):
#     pass
#
# class G(E, F):
#     pass


# GEACFBD #


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
print(H.__mro__)
# H的MRO: ??
# 拆
# L(H)= H + L(G) + L(F) -> H + (GECA) + (FDBECA) -> HGFDBECA (MRO)

# L(G) = G + L(E) -> G +(ECA) -> GECA
# L(F) = F + L(D) + L(E) -> F +(DBCA) + (ECA) -> FDBECA

# L(E) = E +  L(C) + L(A) -> E + (CA) + A -> ECA
# L(D) = D + L(B)+ L(C)  -> D + (BA) + (CA) -> DBCA

# L(c) = C + A  CA
# L(B) = B + A  BA

# L(A) = A

# 合
# + merge((B,), (A, ), 元组......)
#




'''
merge((a, b, e), ( a, b, e))
'''


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 N:
    pass
class O:
    pass
class M(N, O):
    pass
class G(E, M):
    pass
class H(G, F):
    pass

print(H.__mro__)

# H的MRO
'''
L(H) = H + L(G) + L(F) -> H + (MNO) + () -> H G F D B E C A M N O

L(G) = G + L(E) + L(M)  -> G + (ECA) + (MNO) -> GECAMNO
L(F) = F + L(D) + L(E)  -> F + (DBCA) + (ECA) -> FDBECA

L(E) = E + (CA) + A -> ECA
L(M) = M + N + O  -> MNO
L(D) = D + (BA) + (CA) -> DBCA

1. 面试
2. 装逼
3. 考试

H G F D B E C A M N O
'''




3.super

# class Base:
#     def chi(self):
#         print("我没这么干过")
# class Animal(Base):
#     def chi(self):
#         print("吃。。。。。。。")
#
# class Cat(Animal,Base): # Cat Animal Base
#     def chi(self): # 覆盖, 重写
#         super().chi() #  可以把父类中被重写了的内容 引入进来.
#         super(Cat, self).chi() # py2的
#         print("吃鱼")
#
# c = Cat()
# c.chi()


class Foo:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

class Bar(Foo):
    def __init__(self, a, b, c, d):
        super(Bar, self).__init__(a, b, c)
        self.d = d

b = Bar(1,2,3,4)
print(b.__dict__)


4.面试题

# 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)
        print(self.val)  # 5
        self.val += 2 # 7
class Mult(Init):
    def __init__(self, val):
        print("Mult")
        super(Mult, self).__init__(val)
        self.val *= 5
class HaHa(Init):
    def __init__(self, val):
        print("哈哈")
        super(HaHa, self).__init__(val)
        self.val /= 5
class Pro(Add2,Mult,HaHa): #
    pass
class Incr(Pro):
    def __init__(self, val):
        super(Incr, self).__init__(val)
        self.val += 1

print(Incr.__mro__)

# p = Incr(5)  # MRO: Incr Pro Add2 Mult HaHa Init
# # 一个对象. p :  val: 8
# print(p.val)
c = Add2(2) # MRO: ADD2 INIT
print(c.val)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值