裝飾器與函式多層巢狀

2022-04-06 10:32:44 字數 1476 閱讀 5888

# coding: utf-8

def login(func):

print("the first level")

def inner1(*args,**kwargs):

print("the second level")

def inner2(*args):

print("the third level")

func(*args)

func(*args)

return inner2

return inner1

# @login相當於 tv = login(tv) ,把 tv 函式的記憶體位址傳給login的引數 func ,login函式返回其內部函式 inner1 的記憶體位址 給tv 。

#當執行tv函式 的時候,其實是執行了login的 inner1 函式。 即 login 原來的引數 func 指向 tv ; tv 指向 inner1 。

@login

def tv(name,password):

print("welcome [%s] [%s] to tv page" % (name,password) )

@login

def movie(name):

print("welcome [%s] to movie page" % name)

@login

def picture(name,password,type):

print("welcome [%s] [%s] to picture type [%s]" %(name,password,type))

print(tv)

tv = tv("zhou","123")

print(tv)

tv = tv("zhouding","123456")

print(tv)

movie("durant")

picture("kobe bryant","kobe123","nature")

輸出結果:

the first level

the first level

the first level

.inner1 at 0x02f34150>

the second level

welcome [zhou] [123] to tv page

.inner1..inner2 at 0x02f34300>

the third level

welcome [zhouding] [123456] to tv page

none

the second level

welcome [durant] to movie page

the second level

welcome [kobe bryant] [kobe123] to picture type [nature]

注:函式的*args 引數可以接收乙個或者多個引數。

函式巢狀與裝飾器

應用場景,位置引數中代表將多個引數存入元祖,將關鍵字引數傳入字典 位置引數 位置形參 必須被傳值,一一對應 位置實參 按從左到右的順序與形參一一對應 關鍵字引數 按照key value形式指名道姓的為形參傳值,可以完全不按照順序 1.關鍵字實參必須在位置引數的後面 2.可以混用位置實參與關鍵字實參,...

裝飾器,高階函式,巢狀函式

裝飾器 本質是函式,裝飾其他函式 就是為其他函式新增其他功能 原則 1.不能修改被裝飾函式的源 2.不能修改被裝飾函式的呼叫方式 補充記憶體管理機制 函式即變數 匿名函式沒有名字,定義之後馬上被銷毀,除非賦值給乙個變數 def text1 print text1 text2 def text2 pr...

Python 多層裝飾器

python 的裝飾器能夠在不破壞函式原本結構的基礎上,對函式的功能進行補充。當我們需要對乙個函式補充不同的功能,可能需要用到多層的裝飾器。在我的使用過程中,遇到了兩種裝飾器層疊的情況,這裡把這兩種情況寫下來,作為踩坑記錄。def a func defdecorated c fune defdeco...