装饰器

把概念拉下神坛,把代码请进殿堂.--print

文字在思维面前,总有捉襟见肘的时候,比方说,他拿代码,就没有什么招,越形容越晦涩,所以,话不多说,直接上图上代码.

对, 在讲装饰器之前,需要先了解下闭包,上代码

def outer(x,y):

    def inner():
        if x > y:
            return x
        return y
    return inner
res = outer(5,7)
print(res()) #7
print(res()) #7
print(res()) #7
print(res()) #7
#从闭包的结构上可以看出,inner中的x,y,是需要outer从外部接收进来的,而inner也只会在outer的内部找,且outer内部的变量,属于局部空间内的变量,
#所以,在外部不重新给outer传递新的x,y值之前,x,y的值都会保持不变,所以,从上面的代码可以看出,一次赋值,可以多次执行
#致于好处,谁用谁知道.

接下来,了解一下闭包函数的进阶版>>>装饰器,代码如下


from functools import wraps

#验证登录
def login():
    username = input('username>>>:').strip()
    pwd = input('pwd>>>:').strip()
    if username == 'jj' and pwd == '123':
        print('登录成功')
        return True
    else:
        print('登录失败')
        return False

#装饰器
def outter(func):   @wraps(func) def inner(*args,**kwargs): if login(): res = func(*args,**kwargs) else: return return res return inner #调用装饰器 @outter def index(): print('index 在这里.') index()

图上和代码都上了.阐述一下,其实装饰器,接地气一点说,就是个模板,他有两个特点

>>>不改动源代码

>>>不改变调用方式

还能实现想要的功能.这就是他的厉害和独特之处

这么高大上的东西,若不能完全理解,也没关系,咱伟大的前辈,总结了装饰器的标准模板,如下:

from functools import wraps  # 导入装饰器修饰模块

def outter(func):   # 设置外层函数,并设置形参

    @wraps(func)    # 调用方法,修饰函数

    def inner(*args,**kwargs):  # 设置内层函数,设置参数,

        print('方法调用前')

        res = func(*args,**kwargs)  # 接收参数,执行函数,并接收函数返回值

        print('方法调用后')

        return res  # 返回函数返回值

    return inner  # 返回内部函数的内存地址




#讲个笑话,某人在岸上学了两个月游泳的理论知识,感觉很牛X了,结果下水游了会,发现完全不是那么回事.所以道理就是,不懂没关系,多敲多练,把代码输进脑子里,脑子自然会处理,一遍遍重复,自然会记下来.
原文地址:https://www.cnblogs.com/hellozizi/p/11171193.html