真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

由淺入深,走進(jìn)Python裝飾器-----第一篇:基礎(chǔ),原型

摘要: 本文從學(xué)習(xí)裝飾器需要用到的基礎(chǔ)知識入手, 用簡單代碼附以實(shí)例驗(yàn)證,在徹底理解基礎(chǔ)知識的情況下幫助逐步理解, 裝飾器的原型

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),樂都企業(yè)網(wǎng)站建設(shè),樂都品牌網(wǎng)站建設(shè),網(wǎng)站定制,樂都網(wǎng)站建設(shè)報(bào)價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,樂都網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

要點(diǎn): 從閉包及函數(shù)名可當(dāng)參數(shù)傳遞作為基礎(chǔ)理解思路, 由淺入深引入Python裝飾器原型, 進(jìn)而引出裝飾器



**裝飾器背景:**   在不改變原函數(shù)代碼,  且保持原函數(shù)調(diào)用方法不變的情況下,  給原函數(shù)增加新的功能 (或者給類增加新屬性和方法)


**核心思想: **      用一個函數(shù)(或者類) 去裝修 一個舊函數(shù) (或者類)   , 造出一個新函數(shù)(或者新類)

Python萬物皆對象, 可以隨意賦值使用

def func():
    print("第三: ","我是一個函數(shù)的輸出結(jié)果")
a = 1
print("第一: 我是一個變量 ",a)
a = func                                                        #將函數(shù)名賦值給變量
print("第二: 我是一個函數(shù)名 ",a)
a()
>>>第一: 我是一個變量 1
>>>第二: 我是一個函數(shù)名 
>>>第三: 我是一個函數(shù)的輸出結(jié)果

變量作用域

# 根據(jù) LEGB原則, 內(nèi)函數(shù)使用外函數(shù)的局部變量
def outer():
    a = 0
    print("我是外部函數(shù)的 a:",a)
    def inner():
        print("我是內(nèi)部函數(shù)打印的 a:",a)

> > > 我是外部函數(shù)的 a: 0
> > > 我是內(nèi)部函數(shù)打印的 a: 0

# 引入 nonlocal, 內(nèi)函數(shù)可以修改外函數(shù)
def outer():
    a = 0
    print("我是外部函數(shù)的 a:",a)
    def inner():
        nonlocal a
        a += 1
        print("我是內(nèi)部函數(shù)加工過的 a:",a)

>>>我是外部函數(shù)的 a: 0
>>>我是內(nèi)部函數(shù)加工過的 a: 1

閉包( 延長局部變量生存時間 )

# 內(nèi)函數(shù)  夾帶  外函數(shù)的局部變量
def outer():
    a = 0
    print("我是外部函數(shù)打印的 a:",a)
    def inner():
        print("我是內(nèi)部函數(shù)打印的 a:",a)
    return inner

res = outer()                                        # res接收的是一個函數(shù)名
print("我是返回出來的內(nèi)函數(shù)名: "res)
res()

>>>我是外部函數(shù)打印的 a: 0
>>>我是返回出來的內(nèi)函數(shù)名: 
>>>我是內(nèi)部函數(shù)打印的 a: 0
>>>
#  內(nèi)函數(shù)  夾帶  修改后的外函數(shù)的局部變量
def outer():
    a = 0
    print("我是外部函數(shù)打印的 a:",a)
    def inner():
        nonlocal a
        a += 1
        print("我是內(nèi)部函數(shù)修改過的 a:",a)
    return inner

res = outer()                                       # res接收的是一個函數(shù)名
print("我是返回出來的內(nèi)函數(shù)名: "res)
res()

>>>我是外部函數(shù)打印的 a: 0
>>>我是返回出來的內(nèi)函數(shù)名: 
>>>我是內(nèi)部函數(shù)修改過的 a: 1

函數(shù)名可以當(dāng)做參數(shù)傳遞

#新函數(shù)對舊函數(shù)修飾
def old():
    print('我是 舊函數(shù)')     
def new(f):
    print('我是 新函數(shù), 我可以輸出 舊函數(shù)')
    f() 

new( old )                        #把舊函數(shù)名當(dāng)做參數(shù), 傳遞給新函數(shù), 在新函數(shù)內(nèi)產(chǎn)生變化

>>>我是 新函數(shù), 我可以輸出 舊函數(shù)
>>>我是 舊函數(shù)

裝飾器原型

# ### 利用閉包,將函數(shù)名當(dāng)參數(shù)傳遞
def outer(f):
    def inner():
        print("我是外部傳進(jìn)來的old :",f)
        f()
        print("我是修飾工,我在舊函數(shù)后顯示")
    return inner

def old():
    print("我是舊函數(shù)")

print("我是最初的old: ",old)                         
print("我是返回出來的內(nèi)函數(shù)inner: ",outer(old))   #outer把函數(shù)名old當(dāng)參數(shù)傳回函數(shù)內(nèi)部進(jìn)行加工, 把函數(shù)名inner返回
old = outer(old)                            #實(shí)際上, 舊函數(shù)名old已被重新賦值為inner
print("我不是原來的old了 ",old)
old()                                       #經(jīng)過改造, 雖然調(diào)用結(jié)果不變, 但是運(yùn)行結(jié)果已變化

>>>我是最初的old:               
>>>我是返回出來內(nèi)函數(shù)inner:     .inner at 0x00000000021CAAE8>
>>>我不是原來的old了            .inner at 0x00000000021CAAE8>
>>>我是外部傳進(jìn)來的old :        
>>>我是舊函數(shù)
>>>我是修飾工,我在舊函數(shù)后顯示

裝飾器

# ### 用 @outer 修飾
def outer(f):
    def inner():
        print("我是外部傳進(jìn)來的old :",f)
        f()
        print("我是修飾工,我在舊函數(shù)后顯示")
    return inner

@outer                       #實(shí)際上,將  old = outer(old)  這句改成 @outer, 放在old函數(shù)上方
def old():
    print("我是舊函數(shù)")

old()                                                                 
>>>我是外部傳進(jìn)來的old : 
>>>我是舊函數(shù)
>>>我是修飾工,我在舊函數(shù)后顯示

裝飾器的嵌套: 下層裝飾器修飾后的函數(shù), 再次被上層裝飾器修飾

def kuozhan(f):
    def inner():
        print("1我是擴(kuò)展函數(shù),接收外部傳進(jìn)來的新old :",f)
        f()
        print("4我是擴(kuò)展函數(shù),我在新old函數(shù)后顯示")
    return inner

def outer(f):
    def inner():
        print("2我是outer函數(shù),接收外部傳進(jìn)來的old :",f)
        f()
        print("3我是outer函數(shù),我在old函數(shù)后顯示")
    return inner

@kuozhan               #old = kuozhan(outer(old))
@outer                 #old = outer(old)
def old():
    print("我是old函數(shù)")

old()

>>>1 我是擴(kuò)展函數(shù),接收外部傳進(jìn)來的新old : .inner at 0x000000000250AB70>
>>>2 我是外部傳進(jìn)來的old :               
>>>  我是old函數(shù)
>>>3 我是修飾工,我在舊函數(shù)后顯示
>>>4 我是擴(kuò)展函數(shù),我在新old函數(shù)后顯示

文章標(biāo)題:由淺入深,走進(jìn)Python裝飾器-----第一篇:基礎(chǔ),原型
URL地址:http://weahome.cn/article/jsjscp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部