1. 程式人生 > >python學習第十二天:閉包函數與裝飾器

python學習第十二天:閉包函數與裝飾器

源代碼 -s 為什麽 pre def func stop 修改 rom

閉包函數:

什麽是閉包函數:

閉指的是定義在一個函數內部

包指的是該函數包含對外部作用域(非全局作用域)名字的引用

def counter():
  n=0
  def incr():
    nonlocal n
    x=n
    n+=1
    return x
  return incr

c=counter()
print(c())
閉包的意義:返回的函數對象,不僅僅是一個函數對象,在該函數外還包裹了一層作用域,這使得,該函數無論在何處調用,優先使用自己外層包裹的作用域

裝飾器

1.什麽是裝飾器

就目前來看:裝飾器就是定義一個函數,只不過該函數的功能是用來為其它函數添加額外的功能的

其實:裝飾器本身其實可以是任意可調用的對象,

被裝飾的對象也可以是任意可調用的對象。

2.為什麽要用裝飾器

軟件維護應該遵循開發封閉原則:

開放封閉原則指的是:

①軟件一旦上線運行後對修改源代碼是封閉的

②對擴展功能是開放的

這就用到了裝飾器

裝飾器的實現必須遵守兩大原則:

①不可修改被裝飾對象的源代碼

②不可修改被裝飾對象的調用方式

import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print(‘run time is %s‘ %(stop_time-start_time))
        return res
    return wrapper

@timmer
def foo():
    time.sleep(3)
    print(‘from foo‘)
foo()

  

其實@代表語法糖

@timmer 表示foo = timmer(foo)

python學習第十二天:閉包函數與裝飾器