装饰器的作用:在不改变原函数的情况下给函数增加功能 开闭原则:面向修改关闭,面向扩展开放
装饰器(满足开闭原则的设计)
由@符号+语法糖构成
比@classmethod
执行逻辑:
1 调用showlist
2 检测到showlist 有装饰器@checkuser
没有直接执行showlist 反而将showlist 方法作为参数传递个checkuser
并且执行checkuser 的返回值 即check 方法"封装用户检查方法 有Boss来实现" def checkuser(fun): def check(): username = input("请输入用户名") if username == "wzk": print("有权限执行方法") fun() # showlist() # showmoney() # showdiscount() else: print("未授权") return check "查看订单 由程序员A完成" @checkuser def showlist(): print("你的订单有:") for i in range(10): print("订单" + str(i)) "查看余额 有程序员C完成" @checkuser def showmoney(): "需要操作数据库等复杂操作" print("你当前有余额10000¥") "查看优惠券 有程序员D完成" @checkuser def showdiscount(): print("你有优惠券100 200 300 500") "展示数据 由程序员B完成" showlist() showmoney() showdiscount()
装饰器的形成
def checkuser(fun): def check(): username = input("请输入用户名") if username == "wzk": print("有权限") fun() else: print("未授权") return check def shoulist(): print("展示列表成功") # result = checkuser(shoulist) # result() shoulist = checkuser(shoulist) shoulist()
带参数 带返回值的装饰器
def checkuser(fun): def check(*args, **kwargs): username = input("请输入用户名") if username == "wzk": return fun(*args, **kwargs) else: print("未授权") return check @checkuser def showlist(n, all): print("展示订单列表第"+str(n)+"页,共有"+str(all)+"页") @checkuser def showmoney(): print("显示余额") @checkuser def showinfo(): return "hello" showlist(10,100) showmoney() print(showinfo())
Flask:使用装饰器
1, pip install flask
2, from flask import Flask
3, 创建一个应用
4,注册路由(URL)
5,启动服务from flask import Flask,render_template app = Flask(__name__) @app.route("/") def index(): return "首页" @app.route("/wzk") def wzkinfo(): return "王增科的个主页" @app.route("/zyp") def zypinfo(): return "张宇鹏的个主页" @app.route("/wzk/pay") def wzkpay(): # return "<h1>王增科各种网站充值页面</h1>" return render_template('pay.html', name = "张振杰") app.run()
类装饰器
类装饰器通过构造方法以及call方法来实现
当程序检测到函数有类装饰器时没有直接执行函数,将函数作为参数传递个类的构造函数
当该函数调用时会执行类的call函数class CheckUser(): def __init__(self, fun): print("构造方法") self.f = fun def __call__(self, *args, **kwargs): print("call方法") self.f() # cu = CheckUser() "使用实例名()会执行类内部call方法" # cu() @CheckUser def showlist(): print("展示订单列表") showlist()