python中and与or的执行顺序-python之执行顺序随记
python的执行顺序一直都是很令人头疼,简单随记了一些
1、正常顺序执行。
print(1)a = 2l = [3]
这个就不附结果了,都能猜得到,这种按顺序执行,还有像等号双等号这种,都是从右边开始执行,执行等号右边,赋值给等号左边。
2、函数的执行过程
#coding=utf-8
defa():print('is a')defb():
a()print('b use a')defc():
b()print('c use b')defd():
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
classA:def __init__(self):print('init a')
param= 1
print(param)classB:def __new__(cls, *args, **kwargs):print('new b')classC: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、类中一个运行的小实例
classA:def __init__(self,name):print('A class',A.__class__,name)classB(A):def __init__(self,name):
self.name=name
A.__init__(self,name)print("B class",B.__class__,name)#print('this is B')
classC(B):def __init__(self,name):
B.__init__(self,name)print("c class")
c= C('jery')
这里会怎么执行呢??先猜一下
结果就是
A class jery
B class jery
c class
结合自己理解更加深入了解一下。
总结一下:
1) __new__方法在__init__方法前执行;
2) __new__必须要有返回值,返回实例化出来的实例,实例传给init,然后init再去执行,如果没有实例化的对象,init就不会执行;
3) 函数以及其他遵循一行一行执行。