zoukankan      html  css  js  c++  java
  • 面试官初问之装饰器

    对于装饰器在Python中的应用,实在是数不胜数,在面试的问题中也是拷问的必备项,那么要如何回答这个问题才能算得上是完美的回答呢?装饰器就是验证登录的,在你进入这个view之前我先验证你是不是登录的状态。OK,这个回答没有问题,但是你也被OUT了,简单的了解与使用是初级程序员常常犯的错误,面试官显然是要你造火箭的能力啊!兄弟!!

    所谓的装饰器仅仅是一种语法糖,可作用的对象可以是函数也可以是类,装饰器本身就是一个函数,其主要的工作方式就是将被装饰的类或者函数作为参数传递给装饰器函数,最简单的装饰器比如

    import time
    
    def run_time(func):
        def wrapper(*args, **kwargs):
            start = time.time()
            r = func(*args, **kwargs)
            print(time.time() - start)
            return r
        return wrapper
    

    OK,我们使用这个装饰器来装饰一个test函数

    @run_time
    def test():
        print("666")  # 函数执行先打印整个,再打印时间
    

    整个函数运行的本质可以展开为test = run_time(test)装饰器在解释器运行的时候就已经被加载,从而被装饰的函数将被装饰的函数展开为如上的方式,因为run_time装饰器返回wrapper函数,所以当调用test函数时其实就是对wrapper的调用,如果直接打印test函数就能发现其实打印的是装饰器中wrapper函数的地址。

    接下来看看带参数的装饰器,通常在Flask中路由的使用就是代参装饰器。

    import time
    
    def router(url):
    	def decorator(func):
    		func.__url__ = url
    		return func
    	return decorator
    	
    @router(r'/')
    def index():
    	return "hello world"
    
    

    大家可以发现在使用route装饰器的时候,我们其实是调用了route函数,route函数返回一个decorator装饰器,因此我们不需要在装饰器内运行函数,所以不需要一个wrapper函数来手机参数

    OK!装饰器最简单的模板

    def deco(func):
    	def wrapper(*args, **kwargs):
    		res = func(*args, **kwargs)
    		retrun res
    	return wrapper
    
    
  • 相关阅读:
    html5+css3中的background: -moz-linear-gradient 用法 (转载)
    CentOS 安装Apache服务
    Linux 笔记
    CURL 笔记
    Spring Application Context文件没有提示功能解决方法
    LeetCode 389. Find the Difference
    LeetCode 104. Maximum Depth of Binary Tree
    LeetCode 520. Detect Capital
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 136. Single Number
  • 原文地址:https://www.cnblogs.com/Dr-wei/p/12555432.html
Copyright © 2011-2022 走看看