• python之执行顺序随记


    python的执行顺序一直都是很令人头疼,简单随记了一些

    1、正常顺序执行。

    print(1)
    a = 2
    l = [3]

    这个就不附结果了,都能猜得到,这种按顺序执行,还有像等号双等号这种,都是从右边开始执行,执行等号右边,赋值给等号左边。

    2、函数的执行过程

    # coding=utf-8
    def a():
        print('is a')
    def b():
        a()
        print('b use a')
    def c():
        b()
        print('c use b')
    def d():
        c()
        print('d use c')
    
    d()

    这里面总共定义了4个函数,调用d()时,又用了c(),依次类推,输出结果也就可想而知了。也就是如图

    结果:

    is a
    b use a
    c use b
    d use c

    3、类就比较麻烦了,魔法方法__new__比__init__方法前执行,具体的执行顺序上例子

    # coding=utf-8
    class A:
        def __init__(self):
            print('init a')
    
        param = 1
        print(param)
    
    class B:
        def __new__(cls, *args, **kwargs):
            print('new b')
    
    class C:
    
        def __init__(self):
            print('init c')
        def __new__(cls, *args, **kwargs):
            print('new c')
    A()
    B()
    C()

    猜一下直接运行结果吧先。。。会出现什么呢

    哈哈哈,结果就是:

    1
    init a
    new b
    new c

    得出,自定义变量>魔法方法__new__>__init__方法前执行,我们也发现了,为什么new跟init同时存在,只运行了new,而没打印init呢?

     科普一下new:

    __new__()用于创建实例,该方法是在实例创建之前被调用,它是类级别的方法,也是静态方法;

    科普一下init:

    __init__()至少有一个参数self,__new__()返回的实例传给init,也就是传给self,__init__()在__new__()的基础上完成一些初始化的操作。

    结果对比:

    __new__()必须有返回值,返回实例对象;

    __init__()不需要返回值。

      __new__必须要有返回值,返回实例化出来的实例,__init__有一个参数self,就是这个__new__返回的实例,__init____new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

      如果__new__() 创建的是当前类的实例,会自动调用__init__()函数,通过return调用的__new__()的参数cls来保证是当前类实例,如果是其他类的类名,那么创建返回的是其他类实例,就不会调用当前类的__init__()函数。

    想要执行他就需要在new方法下加上   return super(C, cls).__new__(cls)

    这里知道的并不是太懂。

    4、类中一个运行的小实例

    class A:
        def __init__(self,name):
            print('A class',A.__class__,name)
    
    class B(A):
        def __init__(self,name):
            self.name = name
            A.__init__(self,name)
            print("B class",B.__class__,name)
    
        # print('this is B')
    
    class C(B):
        def __init__(self,name):
            B.__init__(self,name)
            print("c class")
    
    c = C('jery')

    这里会怎么执行呢??先猜一下

    结果就是

    A class <class 'type'> jery
    B class <class 'type'> jery
    c class

    结合自己理解更加深入了解一下。

    总结一下:

    1)    __new__方法在__init__方法前执行;
    2)   __new__必须要有返回值,返回实例化出来的实例,实例传给init,然后init再去执行,如果没有实例化的对象,init就不会执行;
    3)   函数以及其他遵循一行一行执行。 

  • 相关阅读:
    EF Core 小技巧:迁移已经应用到数据库,如何进行迁移回退操作?
    ABP Framework 5.0 RC.1 新特性和变更说明
    OI迷惑行为大赏【目前较少,持续更新中】
    【比赛日志】APIO2020(2020.08.15)
    【好题】【IPSC2003】 Got Root? 无向图删边游戏
    [HNOI2019] 校园旅行 —— 一个边界数据
    【题解】JOISC 2020 Day 3 stray
    ExtJS学习:MVC模式案例(四) 林枫705
    ExtJS学习:MVC模式案例(三) 林枫705
    ExtJS学习:MVC模式案例(二) 林枫705
  • 原文地址:https://www.cnblogs.com/dflblog/p/11598271.html
Copyright © 2020-2023  润新知