python閉包、裝飾器

概念:在一個函數(shù)內(nèi)部再定義一個函數(shù),定義的函數(shù)引用外部函數(shù)的變量,那么這個定義的函數(shù)和變量就叫閉包。

#如果要修改變量,先用nonlocal申明

例子:類定義

class lnfun(object):

? ? ?? def __init__(self,k,b):

? ? ? ? ? ? ? self.k=k

? ? ? ? ? ?? self.b=b

? ? ?? def cal(self,x):

? ? ? ? ? ?? print(self.k*x+self.b) ? ? ? ? ? ? ? ? #較麻煩

例子:裝飾器?

? ? ?? def ?? outer(k,b):

? ? ? ? ? ? ? def? inner(x):

? ? ? ? ? ? ? ? ? ?? print(kx+b) ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ?? return inner ? ? ? ? #使用閉包的優(yōu)點是代碼精簡

調(diào)用:

a=outer(1,2)

a(5)

裝飾器:

概念:在不修改函數(shù)功能的基礎上,擴展功能

單層裝飾器:

def outer(fun):

? ? ? def inner():

? ? ? ? ?? print('你真皮')

? ? ? ? ? ? fun()

? ? ? return inner

@outer? ? ? #base_fun=outer(base_fun)

def base_fun():

? ? ? ? ? print('瞅你咋地')


base_fun() ? ? ?? #相當于加了一層裝飾

多層裝飾器:

def out1(fun):

? ? ? ? print('快點吃飯啊')

? ? ? ? def in1():

? ? ? ? ? ? print('那就別吃了')

? ? ? ? ? ? fun()

? ? ? ? return in1

def out2(fun):

? ? ? ? print('不吃飯打你屁屁')

? ? ? ? def in2():

? ? ? ? ? ? ?? print('吃什么好呢')

? ? ? ? return in2

@out1? # eat=out1(eat)

@out2? # eat=out2(eat)

def eat():

print('沒有食欲')

eat()

“”“調(diào)用順序:裝飾器裝飾遵循最近原則,理解引用,引用的是in指向的代碼塊?!啊薄?/p>

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 閉包 閉包實現(xiàn)函數(shù)嵌套外函數(shù)里包裝一個內(nèi)函數(shù)外函數(shù)作用域有一個局部數(shù)據(jù)對象內(nèi)部函數(shù)對于外部函數(shù)作用域里非全局變量的...
    心水Diana閱讀 226評論 0 0
  • 1. 閉包 在函數(shù)內(nèi)部再定義一個函數(shù),并且內(nèi)部函數(shù)用到了外部函數(shù)作用域里的變量(enclosing),那么將這個內(nèi)...
    C_Z_Q_閱讀 200評論 0 4
  • 裝飾器本質(zhì)上是一個函數(shù),該函數(shù)用來處理其他函數(shù),它可以讓其他函數(shù)在不需要修改代碼的前提下增加額外的功能,裝飾器的返...
    胡一巴閱讀 474評論 0 0
  • 閉包 內(nèi)部函數(shù)調(diào)用外部函數(shù)的變量(一個閉包就是你調(diào)用的一個函數(shù)A,這個函數(shù)A返回一個函數(shù)B給你。這個返回的函數(shù)B就...
    等哈光圈閱讀 244評論 0 0
  • ### 裝飾器定義 **在不改變原有函數(shù)代碼,且保持原函數(shù)調(diào)用方法不變的情況下,給原函數(shù)增加新的功能(或者給類增加...
    lmonkey_01閱讀 273評論 0 0

友情鏈接更多精彩內(nèi)容