一、有一个方法

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

>>> 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
美国人,不吃辣