python之有參裝飾器

2022-04-10 20:22:01 字數 3156 閱讀 9440

由於語法糖@的限制,outter函式只能有乙個引數,並且該引數只用來接收被裝飾物件的記憶體位址

def outter(func):   # func = 函式的記憶體位址

res=func(*args,**kwargs)

return res

# @outter

@outter # outter(index)

def index(x,y):

print(x,y)

山炮玩法:

def auth(func,db_type):

name=input('your name>>>: ').strip()

pwd=input('your password>>>: ').strip()

if db_type == 'file':

print('基於檔案的驗證')

if name == 'egon' and pwd == '123':

res = func(*args, **kwargs)

return res

else:

print('user or password error')

elif db_type == 'mysql':

print('基於mysql的驗證')

elif db_type == 'ldap':

print('基於ldap的驗證')

else:

print('不支援該db_type')

@auth # 賬號密碼的**是檔案

def index(x,y):

print('index->>%s:%s' %(x,y))

@auth # 賬號密碼的**是資料庫

def home(name):

print('home->>%s' %name)

@auth # 賬號密碼的**是ldap

def transfer():

print('transfer')

index=auth(index,'file')

home=auth(home,'mysql')

transfer=auth(transfer,'ldap')

# index(1,2)

# home('egon')

# transfer()

山炮二

def auth(db_type):

def deco(func):

name=input('your name>>>: ').strip()

pwd=input('your password>>>: ').strip()

if db_type == 'file':

print('基於檔案的驗證')

if name == 'egon' and pwd == '123':

res = func(*args, **kwargs)

return res

else:

print('user or password error')

elif db_type == 'mysql':

print('基於mysql的驗證')

elif db_type == 'ldap':

print('基於ldap的驗證')

else:

print('不支援該db_type')

return deco

deco=auth(db_type='file')

@deco # 賬號密碼的**是檔案

def index(x,y):

print('index->>%s:%s' %(x,y))

deco=auth(db_type='mysql')

@deco # 賬號密碼的**是資料庫

def home(name):

print('home->>%s' %name)

deco=auth(db_type='ldap')

@deco # 賬號密碼的**是ldap

def transfer():

print('transfer')

index(1,2)

home('egon')

transfer()

語法糖

def auth(db_type):

def deco(func):

name = input('your name>>>: ').strip()

pwd = input('your password>>>: ').strip()

if db_type == 'file':

print('基於檔案的驗證')

if name == 'egon' and pwd == '123':

res = func(*args, **kwargs) # index(1,2)

return res

else:

print('user or password error')

elif db_type == 'mysql':

print('基於mysql的驗證')

elif db_type == 'ldap':

print('基於ldap的驗證')

else:

print('不支援該db_type')

return deco

def index(x, y):

print('index->>%s:%s' % (x, y))

def home(name):

print('home->>%s' % name)

@auth(db_type='ldap') # 賬號密碼的**是ldap

def transfer():

print('transfer')

# index(1, 2)

# home('egon')

# transfer()

def 有參裝飾器(x,y,z):

def outter(func):

res = func(*args, **kwargs)

return res

return outter

@有參裝飾器(1,y=2,z=3)

def 被裝飾物件():

pass

python函式之有參裝飾器

一 為什麼要有有參裝飾器?來看之前的無參裝飾器 無參裝飾器 defoutter func start time.time res func args,kwargs 我們需要乙個變數接受函式的返回值 end time.time print run time is s end start return ...

python中裝飾器之有參裝飾器(三)

在呼叫無參裝飾器時,不需要在外層傳遞引數。適用於例如 為某個函式增加統計執行時間功能 為某個函式執行前增加登入認證功能 在呼叫有參裝飾器時,對其傳入乙個或多個引數。適用於例如 驗證使用者型別 def user auth user group def def inner args,kwargs if ...

python之有參裝飾器和迭代器用法

1.有參裝飾器 是無參裝飾器的加強版 在無參裝飾器上面再包個函式 相當於多增加乙個值 無參裝飾器函例圖 def check func index 執行的先執行 check check index 把index記憶體位址賦值給func 得到check user記憶體位址返回值並賦值新的index變數名...