python多重继承的属性和方法调用顺序问题和对迭代器的初步理解

Posted 徐阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python多重继承的属性和方法调用顺序问题和对迭代器的初步理解相关的知识,希望对你有一定的参考价值。

推荐阅读:https://www.cnblogs.com/bigb/p/11650707.html

计算机学习的一个好办法就是自己将代码跑一遍,了解代码的运作顺序和原理(主要弄懂 函数作用,传入参数,返回值)

见代码:

 

class A(object):
    def __init__(self):
        print(\'A\')
        super(A, self).__init__()


class B(object):
    def __init__(self):
        print(\'B\')
        super(B, self).__init__()


class C(A):
    def __init__(self):
        print(\'C\')
        super(C, self).__init__()


class D(A):
    def __init__(self):
        print(\'D\')
        super(D, self).__init__()


class E(B, C):
    def __init__(self):
        print(\'E\')
        super(E, self).__init__()


class F(C, B, D):
    def __init__(self):
        print(\'F\')
        super(F, self).__init__()


class G(D, B):
    def __init__(self):
        print(\'G\')
        super(G, self).__init__()


if __name__ == \'__main__\':
    f = F()

F
C
B
D
A

重点关注class F,在实现这个类的时候,采用了堆栈的原理。

先执行了print(“F”),随后按照C,B,D的顺序执行完一个就压入栈。所以此时的输出顺序为C,B,D,这时候再按照D,B,A的顺序(出栈)执行supre函数所继承的父类中的函数和方法。

 

注:说起来比较抽象,函数还是要自己跑一遍。推荐单步执行的方式明白每一行代码和每一个函数都是都是怎么工作的。(作用,参数,返回值的角度)

补充:

     supre函数的常用格式   supre(当前类名,self).父类中的方法或属性

 迭代器:

 

 

   推荐阅读:https://www.cnblogs.com/Yanjy-OnlyOne/p/10147052.html

   推荐代码:

    

def odd():

    print(\'step 1\')
    yield 1
    print(\'step 2\')
    yield(3)
    print(\'step 3\')
    yield(5)      #yield会返回一个迭代器,不过值会储存在迭代器内,通过迭代可以取出来,而且for循环的实质是由上次断掉的地方重新继续运行

o=odd()         #调用函数只是会返回一个生成器  (推荐此行加断点)

for i in o:     #for循环本质是不断调用next方法,而只是在调用的时候才会去执行函数,随用随取。(将本段代码设置断点跑一跑就知道了)
    print(type(i))#迭代器只是一个容器,用来储存值的
    print(i)

 

 

注:推荐自己跑一遍代码

迭代器也可以理解为一种对子函数的“冻结”,保存当前子函数中的所有值。下一次调用时由yield之后接着运行

 

以上是关于python多重继承的属性和方法调用顺序问题和对迭代器的初步理解的主要内容,如果未能解决你的问题,请参考以下文章

super

Python菱形继承的初始化问题和继承顺序

Method Resolve Order (MRO) - 类对象属性的解析顺序

super()的用法

python 类 五 : 多重继承的MRO顺序

python 中面向对象编程的几个概念