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