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