最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 详解Python装饰器

    正文概述    2020-06-24   195

    详解Python装饰器

    1、装饰器定义:

    装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。

    2、装饰器的意义:

    装饰器的作用就是为已经存在的对象添加额外的功能。并且同时取出与函数功能不符的代码到装饰器中使之得到重用。

    3、先来看一个最简单的例子  

    #!/usr/bin/env python3
    #-*- coding:utf-8 -*-
    
    user_statues = False # vip用户登陆后改为True
    def login(func):
        def inner():
            _user = 'cc' #假设调用了数据库
            _password = 's,123'
            global user_statues #声明全局变量
            if user_statues == False:
                user = input('用户名:')
                password = input('密码:')
                if _user == user and _password== password:
                    print('welcome %s login'%user)
                    user_statues = True
                else:
                    print('Invalid user or password...')
            else:
                print('You haved allready login!')
            if user_statues:
                func() # 验证通过了就调用相应功能
        return inner #用户调用login时,只会返回inner的内存地址,下次调用时再加上()才会执行inner函数
    
    def home():
        print('-----首页-----')
    def China():
        print('----中国----')
    
    def foreign():
        print('----外国----')
    China = login(China) # china = login(China) ,login调用被修饰函数的函数名(China)作为参数,然后再将返回值赋给被修
    饰函数(China)
    
    foreign = login(foreign)
    China() # 用户调用
    
    foreign() # 用户调用

    注意: 

    软件的开放-封闭原则

    封闭:已实现的功能代码不应该被修改

    开放:对现有功能的扩展开放

    可以看出装饰器就是功能扩展专生的一般,专治各种不服,我既未修改原本的China函数,foreign()函数,又实现了认证登录。

    China = login(China)可以替换为 @login,@login要发挥作用就得写在紧贴所修饰的函数上方。

    4、装饰器进阶版

    #!/usr/bin/env python3
    #-*- coding:utf-8 -*-
    
    #传参数普通版
    
    user_status = False
    def login(func):
        def inner(*args,**kwargs):
            _user = 'sc'
            _pwd = 's,514'
    
            global user_status
            if user_status == False:
                user = input('用户名:')
                pwd = input('密码:')
                if _user == user and _pwd== pwd:
                    print('Welocome %s login!'%user)
                    user_status = True
                else:
                    print('Invalid username or password...')
            else:
                print('Ypu haved already login!')
            if user_status:
                func(*args,**kwargs) #无论是否传参都行
        return inner
    
    def home():
        print('-------首页---------')
    @login          #jp = login(jp)
    def jp(name):
        print('------日本专区------',name)
    
    home()
    jp('宫崎骏')

    5、装饰器高阶版

    #!/usr/bin/env python3
    #-*- coding:utf-8 -*-
    
    #微信、QQ升级版传参
    user_status = False
    def login(auth_type): #QQ或微信登陆
        def outer(func): # jp
            def inner(*args,**kwargs):#’宫崎骏‘
                _user = 'sc'
                _pwd = 's,514'
                global user_status
                if user_status == False:
                    user = input('用户名:')
                    pwd = input('密码:')
                    if _user == user and _pwd== pwd:
                        print('Welocome %s login!'%user)
                        user_status = True
                    else:
                        print('Invalid username or password...')
                else:
                    print('Ypu haved already login!')
                if user_status:
                    func(*args,**kwargs) #无论是否传参都行
            return inner
        return outer
    def home():
        print('-------首页---------')
    @login('qq')     # xx = login('qq')=outer  @outer= outer(jp)=inner
    def jp(name):
        print('------日本专区------',name)
    @login('weixin')
    def americ():
        print('------美国专区-------')
    jp('宫崎骏')

    注意: @login('qq') 实际上可拆分为两部分@ 和 login('qq'),分两步,第一步,将’qq‘作为login的参数传入,

    返回outer,此时@outer再将紧接后面的函数名(jp)作为outer的参数传入,返回inner给用户调用的方法即jp('宫崎骏'),

    符合条件后跳转到相关函数功能执行功能。


    起源地下载网 » 详解Python装饰器

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元