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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM