• Python基础知识之装饰器


    定义

    本质是函数,(装饰其他函数)为其他函数添加附加功能。

    原则

    1. 不能修改被装饰的函数的源代码
    2. 不能修改被装饰的函数的调用方式

    实现装饰器知识储备

    • 函数即“变量”
    • 高阶函数
    • 嵌套函数

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

    1. 函数即“变量”:

    定义一个函数就相当于定义一个变量,即将函数体赋值给一个变量名。python的内存回收机制规定:当存储在内存中的内容没有对应的变量名指定时,则当内存回收机制定期清理内存的时候则回收内存。

    2. 高阶函数:

    • 把一个函数名当作实参传给另外一个函数(在不修改被装饰函数源代码的前提下添加新功能)
    	def bar():
    	    print("in the bar")
    	    
    	#  test1就是一个高阶函数
    	def test1(func):
    	    print(func)
    	    func()
    	    
    	    
    	test1(bar)
    
    • 返回值中包含函数名
      (不修改函数的调用方式)

    3. 嵌套函数:

    		在一个函数的函数体内用def声明一个新的函数。
    		def func1():
    		    def func2():
    		        pass
    

    装饰器案例剖析

    import time
    
    # 这里的timer就是一个装饰器
    def timer(func):
        def deco(*args, **kwargs):
            start_time = time.time()
            func(*args, **kwargs)
            end_time = time.time()
            print("the func run time is %s" %(end_time-start_time))
        return deco
    
    # 装饰器的调用
    @timer  # test1 = timer(test1)
    def test1():
        time.sleep(3)
        print("in the test1")
    
    
    test1()
    

    装饰器高级案例

    user, passwd = 'bear', '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("Password:").strip()
                    if user == username and passwd == password:
                        print("User has passed authtication")
                        res = func(*args, **kwargs)
                        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")  # home = wrapper()
    def home():
        print("welcome to home page")
        return "from home"
    @auth(auth_type = "ldap")
    def bbs():
        print("welcome to bbs page")
    
    
    print(home())  #wapper()
    
  • 相关阅读:
    Hash碰撞 & 拒绝服务漏洞
    Java: 在不同windows主题下,JFrame窗口设置最佳高度的解决方案
    java: 关于从jar中读取资源遇到的问题getClass().getResource(...)
    Windows 服务程序、窗口界面、桌面交互、与远程桌面
    MySQL用户与权限管理
    Linux 用户与用户组
    书单整理
    2013年个人工作与学习总结
    Raphaël.js学习笔记
    Ant学习笔记(2) 在Eclipse中使用Ant
  • 原文地址:https://www.cnblogs.com/bearkchan/p/8046498.html
Copyright © 2020-2023  润新知