python高阶02--装饰器

装饰器的作用:在不改变原函数的情况下给函数增加功能                                                   开闭原则:面向修改关闭,面向扩展开放
装饰器(满足开闭原则的设计)
由@符号+语法糖构成
比@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()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值