一、閉包
1、閉包概念:
def fn(num): # 閉包的基本格式
def fn_in():
print("---------------%s" % num)
return fn_in
ret = fn(30)
ret()
以上,ret = fn(30)做了一下幾件事情:
1,讓fn_in指向某個記憶體空間(函式)
2,在這個空間中建立乙個num指向30
3,把fn_in的引用返回給ret, 即讓ret指向fn_in指向的這個記憶體
所以,ret()就表示呼叫fn_in這個函式
我們把內部函式和外部變數(在外部函式fn內部的變數,包括形參)這個整體稱為閉包
2、閉包特點
閉包的特點是:每呼叫一次外部函式,都會建立乙個閉包
閉包的一大應用:裝飾器
二、裝飾器
1、裝飾器概念、作用、書寫格式
裝飾器是由閉包支撐的一種語法糖
作用:在不需要做任何**的變動的前提下增加額外的功能
2、通用裝飾器
(1)、用裝飾器裝飾帶乙個引數的函式
def fn(func):
def fn_in(a): # 這個a用來 接收第19行中的引數30
print("驗證1")
print("驗證2")
func(a)
return fn_in
@fndef f1(num):
print("----%s" % num)
f1(30)
(2)、用裝飾器裝飾帶不定長引數的函式
def fn(func):
def fn_in(*args, **kwargs):
print("驗證1")
print("驗證2")
func(*args, **kwargs)
return fn_in
@fndef f1(num, *args, **kwargs):
print("----%s" % num)
print(args)
print(kwargs)
f1(30, 40, 50, name="python")
(3)、用裝飾器裝飾帶返回值的的函式————通用版的裝飾器
def fn(func):
def fn_in(*args, **kwargs):
print("驗證1")
print("驗證2")
return func(*args, **kwargs)
return fn_in
@fndef f1(num, *args, **kwargs):
print("----%s" % num)
print(args)
print(kwargs)
# return "ok"
ret = f1(30, 40, 50, name="python")
print(ret)
4、多個裝飾器裝飾乙個函式
def make_div(func):
def fn_in():
return ""+func()+"
" return fn_in
def make_p(func):
def fn_in():
return ""+func()+"
" return fn_in
@make_div
@make_p
def f1():
return "人生苦短"
ret = f1()
print(ret)
多個裝飾器的裝飾過程: 離函式最近的裝飾器先裝飾(先裝飾就先畫圖),然後外面的裝飾器再進行裝飾,由內到外的裝飾過程
5、類裝飾器的使用
__call__方法 的作用: 可以利用它來實現用類物件來做裝飾器。
__call__方法執行時機: 物件名() 會呼叫到__call__方法
class myclass(object): # 類裝飾器
def __init__(self, f):
self.f = f
def __call__(self):
"""什麼時候執行? 通過 物件名() 的方式來呼叫"""
print("驗證1")
print("驗證2")
self.f()
@myclass # 相當於 f1 = myclass(f1) f1已經重新指向了myclass建立的物件
def f1():
print("----f1----")
f1() # 呼叫到__call__() 方法
python基礎 裝飾器高階
在之前的部落格中裝飾器初識 了解了函式閉包 裝飾器,這篇筆記來繼續了解下裝飾器的高階用法 我們先來看乙個通用的裝飾器寫法 def func definner args,kwargs print before ret func args,kwargs print after return ret re...
Python高階之裝飾器
要理解python裝飾器,首先要明白在python中,函式也是一種物件,因此可以把定義函式時的函式名看作是函式物件的乙個引用。既然是引用,因此可以將函式賦值給乙個變數,也可以把函式作為乙個引數傳遞或返回。同時,函式體中也可以再定義函式。可以通過編寫乙個純函式的例子來還原裝飾器所要做的事。def de...
Python基礎 高階函式之裝飾器(三)
先定義乙個簡單的函式 def sum x,y print x y eval x y sep sum 37,73 執行結果 x y 110 現在我們假設想要增加上面函式的功能,比如對函式做乙個簡單的說明,但又不希望修改這個求和函式的定義。此時就需要用到裝飾器 decorator 了。所謂裝飾器,就是在...