日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

24、Python之有參裝飾器

 印度阿三17 2020-03-24

目錄

一、前置知識(shí)

1.1 無參裝飾器模板

def outter(func):
    def wrapper(*args,**kwargs):
        # 1、調(diào)用原函數(shù)
        # 2、給原函數(shù)增加新的功能
    	res=func(*args,**kwargs)
    	# 3、給原函數(shù)增加新的功能
    	return res
    return wrapper

@outter # index=outter(index)
def index(x,y):
    """這個(gè)是主要功能"""
    print(x,y)
    
print(index) # <function outter.<locals>.wrapper at 0x0000027FF77B20D0>
print(index.__name__) # wrapper,實(shí)際上還是wrapper函數(shù)
print(help(index)) # wrapper的文檔注釋如下:
'''
Help on function wrapper in module __main__:

wrapper(*args, **kwargs)
    這個(gè)是主要功能

None
'''
# 經(jīng)裝飾之后的函數(shù),還是沒有完全偽裝的跟原函數(shù)一樣,需要繼續(xù)優(yōu)化

1.2 裝飾器wraps

#偷梁換柱,即將原函數(shù)名指向的內(nèi)存地址偷梁換柱成wrapper函數(shù),所以應(yīng)該將wrapper做的跟原函數(shù)一樣才行

from functools import wraps  # 引入functools模塊下的裝飾器wraps

def outter(func):
    @wraps(func)  # functools模塊下提供的裝飾器wraps,可以實(shí)現(xiàn)保留原函數(shù)屬性的操作
    def wrapper(*args,**kwargs):
        # 1、調(diào)用原函數(shù)
        # 2、給原函數(shù)增加新的功能
    	res=func(*args,**kwargs)
    	# 3、給原函數(shù)增加新的功能
    	return res
    return wrapper

二、有參裝飾器

2.1 有參裝飾器的實(shí)現(xiàn)

若在無參裝飾器的基礎(chǔ)上,再實(shí)現(xiàn)一個(gè)用來為被裝飾對(duì)象添加認(rèn)證功能的裝飾器,需要在deco外部再包一層函數(shù)auth,用來專門接受額外的參數(shù),這樣便保證了在auth函數(shù)內(nèi)無論多少層都可以引用到。

def auth(db_type):
    def deco(func):
        def wrapper(*args, **kwargs):
            name = input('your name>>>: ').strip()
            pwd = input('your password>>>: ').strip()

            if db_type == 'file':
                print('基于文件的驗(yàn)證')
                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的驗(yàn)證')
            elif db_type == 'ldap':
                print('基于ldap的驗(yàn)證')
            else:
                print('不支持該db_type')
        return wrapper
    return deco


@auth(db_type='file')  # @deco # index=deco(index) # index=wrapper
def index(x, y):
    print('index->>%s:%s' % (x, y))

@auth(db_type='mysql')  # @deco # home=deco(home) # home=wrapper
def home(name):
    print('home->>%s' % name)


@auth(db_type='ldap')  # 賬號(hào)密碼的來源是ldap
def transfer():
    print('transfer')

index(1, 2)
home('egon')
transfer()

2.2 有參裝飾器模板

def 有參裝飾器(x,y,z):
    def outter(func):
        def wrapper(*args, **kwargs):
        	# 1、為其增加新功能
            res = func(*args, **kwargs)
            return res
            # 2、調(diào)用原函數(shù)后為其增加其他新功能
        return wrapper
    return outter

@有參裝飾器(1,y=2,z=3)
def 被裝飾對(duì)象():
    pass
來源:https://www./content-1-666251.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多