天天看點

python--裝飾器

一、有一個方法

def hunan():
    print('我是湖南人')
hunan()      

結果:

我是湖南人      

二、不改變被裝飾函數代碼及調用方法

def food(func):
    def eat():
        china_id = '123456'
        input_id = input('請輸入×××編号:')
        if input_id == china_id:
            print('吃辣椒')
            func()
        else:
            print('錯誤的編号')
    return eat
@food    # == huname=food(huname)
def hunan():
    print('我是湖南人')
hunan()      
請輸入×××編号:123456
吃辣椒
我是湖南人      

注:方法名傳回記憶體位址,方法名() 執行該方法,例如

>>> def fan():
...   print('我愛你')
...
>>> fan
<function fan at 0x0000000001FB86A8>
>>> fan()
我愛你      

三、方法有參數的情況

def hunan(name):
    print('我是湖南人',name)
hunan('Sam')      
我是湖南人 Sam      

裝飾器

def food(func):
    def eat(*args, **kwargs):    # 參數
        china_id = '123456'
        input_id = input('請輸入×××編号:')
        if input_id == china_id:
            print('吃辣椒')
            func(*args, **kwargs)   #參數
        else:
            print('錯誤的編号')
    return eat
@food
def hunan(name):
    print('我是湖南人',name)
hunan('Sam')      
請輸入×××編号:123456
吃辣椒
我是湖南人 Sam      
def identity(national):   # 比無參數多了一層函數
    def food(func):
        def whoami(*args, **kwargs):
            if national == '德國人':
                func(*args, **kwargs)
                print('德國人,吃辣')
            elif national == '美國人':
                func(*args, **kwargs)
                print('美國人,不吃辣')
            else:
                print('不明國籍')
        return whoami
    return food
@identity(national='德國人')
def named(name):
    print('我是%s' % name)
@identity(national='美國人')
def named2(name):
    print('我是%s' % name)

named('Sam')
named2('Jey')      
我是Sam
德國人,吃辣
我是Jey
美國人,不吃辣