Python3装饰器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuisaozhang1292/article/details/79969549

装饰器

    定义:本质是函数,装饰其他函数(就是为其他函数添加附加功能)

    原则:1、不能修改被装饰的函数的源代码

              2、不能修改被装饰的函数的调用方式

实现装饰器的知识储备:1、函数即“变量” 2、高阶函数 3、嵌套函数(在一个函数体内用def去申明一个新函数)

高阶函数+嵌套函数--》装饰器


内存回收机制:变量与函数的内存回收机制是一样的

实例1如下:

def timer(func):
    def deco():
        func()
        print(3)
    return deco
@timer     # ---> test1 = timer(test1)
def test1():
    print(1)

@timer
def test2():
    print(2)

test1()
test2()
输出:
1
3
2
3
实例2如下:
import time

def timer(func):
    def deco():
        start_time = time.time()
        func()
        stop_time = time.time()
        print("the func tun time is %s" %(stop_time-start_time))
    return deco

def test1():
    time.sleep(1)
    print('in the test1')
def test2():
    time.sleep(1)
    print('in the test2')
    
test1 = timer(test1)
test1()
输出如下:
in the test1
the func tun time is 1.0000572204589844


进阶版装饰器(带参数)

user,passwd = 'hcl','abc123'
def auth(auth_type):
    print("auth func",auth_type)
    def outer_wrapper(func):
        def wrapper(*args,**kwargs):
            print("wrapper func args:",*args,**kwargs)
            if auth_type == "local":
                username = input("Username:").strip()
                password = input("Passwd:").strip()
                if user == username and passwd == password:
                    print("User has passed authentication")
                    res = func(*args,**kwargs)
                    print("-----arter authentication--")
                    return res
                else:
                    exit("invalid username or password")
            elif auth_type == "ldap":
                print("ldap")
        return wrapper
    return outer_wrapper

def index():
    print("welcome to index page")
    
@auth(auth_type = "local") # @auth--> home = auth(home) 与  @auth(auth_type = "local")的区别
def home():
    print("welcome to home page")
    return "from home"

@auth(auth_type = "ldap")
def bbs():
    print("welcome to bbs page")
    
index()
print(home())
bbs()

输出如下:

auth func local
auth func ldap
welcome to index page
wrapper func args:
Username:hcl
Passwd:123
invalid username or password
注意: @auth--> home = auth(home)   与    @auth(auth_type = "local")的区别
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页