python的继承,多继承,经典类的MRO,新式类的MRO,C3算法,super

#继承
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() # 雪碧, 娃哈哈

#经典类的MRO,深度优先
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 #

#新式类的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 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

#实例
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

H G F D B E C A M N O
‘‘‘
# 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)

原文地址:https://www.cnblogs.com/PythonMrChu/p/9733684.html

时间: 2024-11-08 06:35:56

python的继承,多继承,经典类的MRO,新式类的MRO,C3算法,super的相关文章

Python基础13_类与类型, MRO, C3算法, super()

一. python多继承 类与类型:http://www.cnblogs.com/blackmatrix/p/5594109.html 子类继承了多个父类, 当父类出现了重名方法时, 这时就涉及到查找父类方法的问题, 即MRO(method resolution order)问题 python中有两种类, 经典类和新式类 在Python2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的特性:反

经典类属性和新式类属性

经典类只@property 没有setter 和deleter class A(object): def __init__(self,price): self.__price=price @property def price(self): return self.__price @price.setter def price(self,value): self.__price=value @price.deleter def price(self): print '@price.deleter

Python中新式类 经典类的区别(即类是否继承object)

首先什么是新式类 经典类呢: #新式类是指继承object的类 class A(obect): ........... #经典类是指没有继承object的类 class A: ........... Python中推荐大家使用新式类 1.新的肯定好哈,已经兼容经典类 2.修复了经典类中多继承出现的bug 下面我们着重说一下多继承的bug 如图: BC 为A的子类, D为BC的子类 ,A中有save方法,C对其进行了重写 在经典类中 调用D的save方法 搜索按深度优先 路径B-A-C, 执行的为

python之继承、抽象类、新式类和经典类

一.上节补充1.静态属性静态属性 : 类的属性,所有的对象共享这个变量 如果用对象名去修改类的静态属性:在对象的空间中又创建了一个属性,而不能修改类中属性的值 操作静态属性应该用类名来操作 例1:请你写一个类,能够统计一共实例化了多少个对象? class Foo: count = 0 def __init__(self): Foo.count += 1 f1 = Foo() print(f1.count) # 1 f2 = Foo() f3 = Foo() f4 = Foo() f5 = Foo

python作用域和多继承

python作用域 python无块级作用域 看c语言代码: #include<stdio.h> int main() { if(2 > 0) { int i = 0; } printf("i = %d", i); return 0; } 在这段代码中,if子句引入了一个局部作用域,变量i就存在于这个局部作用域中,但对外不可见,因此,接下来在printf函数中对变量i的引用会引发编译错误,但是在python中并非如此 看下面代码: if 1 == 1: name =

Python开发基础-Day18继承派生、组合、接口和抽象类

类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承object类的子类成为经典类(在python2中,没有继承object的类,以及它的子类,都是经典类) 1 class People: 2 pass 3 class Animal: 4 pass 5 class Student(People,Animal): #People.Animal称为基类或父类,

python-装饰器,类与对象,私有字段,析构,__call__,继承,多继承,接口

1.装饰器执行流程 装饰器:将原函数替换为wrapper函数 def outer() @outer  --- func1作为参数传入outer() def wrapper()  --- wrapper()放入内存 return wrapper   --- 返回wrapper地址,Func1重新赋值为wrapper Func1()  --- 调用func1函数 def wrapper() print '验证' def Func1() print 'func1' [[email protected]

Python新式类与经典类的区别

1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类,则称之为“经典类”. “新式类”和“经典类”的区分在Python 3之后就已经不存在,在Python 3.x之后的版本,因为所有的类都派生自内置类型object(即使没有显示的继承object类型),即所有的类都是“新式类”. 官方文档 https://www.python.org/doc/new

python中新式类和经典类的区别

1).python在类中的定义在py2-3版本上是使用的有新式类和经典类两种情况,在新式类和经典类的定义中最主要的区别是在定义类的时候是否出现引用object;如:经典类:Class 类名::而新式类定义的时候使用Class 类名(object): 2).定义来源:在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类,则称之为“经典类”. 3).衍生:“新式类”和“经典