python基礎高階之裝飾器

2021-09-26 22:40:33 字數 2384 閱讀 9100

一、閉包

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 了。所謂裝飾器,就是在...