最近一直在学习python,关于装饰器这一点始始终搞的不是太明白在此记录一笔。
装饰器定义:装饰器用来给其它函数添加新功能,装饰其它函数。
装饰器原则:开放封闭原则,不能修改被修饰函数的源代码,且不能修改原有函数的调用方式。
装饰器生产场景:添加新的功能,已经上线的代码,在不修改原有的代码,以及原有函数的调用方式的情况下添加新的功能。
装饰器使用的知识点:
  1)高阶函数
  2)嵌套函数
  3)高阶函数 + 嵌套函数 = 装饰器
先介绍下高阶函数:
高阶函数就是把一个函数当作实参传入另外一个函数
例1:
    def a():
        print(‘my name is a‘)
    def b(func):
        print(func)
        func()
调用:b(a)
输出:<function a at 0x0000024E3CB83400> #等于b函数中的print(func),打印函数a的内存地址
   my name is a                       #等于b函数中的func()此时的func已经被a函数替换,调用fucn()也就是在调用a()
例2:
    def a():
        print(‘my name is a‘)
    def b(func):
        print(func)
        return func
调用:a = b(a)                         #a = func 在把b函数调用的a函数返回的内存地址,赋值给a
      a()                              #现在的a有着函数a的内存地址加个小括号即可调用
输出:<function a at 0x000001C51CFC3400>  
      my name is a
嵌套函数:
嵌套函数是一个函数里用def在声明一个函数。
例:
# Author:Li Shuodzt
def a():
    print(‘my name is a‘)
    def b():
        print("my name is b")
    b()
a()
装饰器实例:
#这里在原有函数上添加了一个充值装饰器,一个登陆装饰器
def pay_money(func1):
    def innet(*args,**kwargs):
        money_num = input(‘请输入充值金额:‘)
        print(‘充值成功,充值金额:‘,money_num)
        func1(*args,**kwargs)
    return innet
def login(func):
    def inner(*args,**kwargs):
        if acount[‘tag‘] is False:
            username = input(‘user:‘)
            password = input(‘password:‘)
            if acount[‘username‘] == username and acount[‘password‘] == password:
                print(‘login success.....‘)
                acount[‘tag‘] = True
                func(*args,**kwargs)
            else:
                print(‘username or password error....‘)
        else:
            print(‘已经登陆成功,验证通过‘)
            func(*args,**kwargs)
    return inner
    
@login
@pay_money
def jepan(vip_level):
    if vip_level > 3:
        print(‘目前你的vip等级大于三解锁本专区所有内容‘)
    else:
        print(‘---jepan专区,还有待解锁内容---‘)
jepan(4)
原文:https://www.cnblogs.com/lishuodzt/p/11541796.html