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)   函数以及其他遵循一行一行执行。