• python


    装饰器

    装饰器的本质:一个闭包函数
    装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
    # 最简单的装饰器:
    # def timemer(qqxing):   #timmer是装饰器的名字,传入的参数就是被装饰的函数
    #     def inner():        #在装饰器中需要定义一个内部函数
    #         qqxing()        #被装饰的函数,并且要执行
    #     return inner        #将内部函数的名字返回
    #
    # def func():
    #     print('我是好人')
    #
    # func = timemer(func)
    # func()
    
    
    # 装饰器中对被装饰的函数功能的扩展
    # def timmer(qqxing):
    #     def inner():
    #         print('调用func之前')
    #         qqxing()
    #         print('调用func之后')
    #     return inner
    #
    # @timmer  #语法糖,语法糖是紧贴着被装饰的函数:语法糖相当于func = timmer(func)
    # def func():
    #     print('我是好人')
    #
    # func()
    # def timmer(qqxing):
    #     def inner(name):
    #         print('调用func之前')
    #         qqxing(name)
    #         print('调用func之后')
    #     return inner
    #
    # @timmer  #语法糖,语法糖是紧贴着被装饰的函数:语法糖相当于func = timmer(func)
    # def func(name):
    #     print('%s是好人'%name)
    #
    # @timmer
    # def func1(name):
    #     print('%s是好人'%name)
    #
    # func('文文')
    # # 完整的装饰--万能的装饰
    # def timmer(qqxing):
    #     def inner(*args,**kwargs):
    #         qqxing(*args,**kwargs)
    #     return inner
    #
    # @timmer
    # def func(name):
    #     print('%s是好人'%name)
    #
    # @timmer
    # def func1(a):
    #     print('func2: %s'%(a))
    #
    # func('tom')
    # func1(a=3)
    装饰器的固定结构:
    def wrapper(func):
    def inner(*args,**kwargs):
    '''被装饰函数执行之前要添加的代码'''
    ret = func(*args,**kwargs)
    '''被装饰函数执行之后要添加的代码'''
    return ret
    return inner
    
    
    开放封闭原则
    开放:对扩展是开放的
    封闭:对修改是封闭的
    装饰器是开放封闭原则的完美演绎

    练习题

    #用装饰器实现,访问art或者dar函数,登陆一次之后,无需再次登录
    # flag = False
    # def login(func):
    #     def inner(*args,**kwargs):
    #         global flag
    #         if flag == False:
    #             username = input('用户名:')
    #             password = input('密码:')
    #             if username == 'alex' and password == 'somebody':
    #                 print('登录成功')
    #                 flag = True
    #         if flag == True:
    #             ret = func(*args,**kwargs)
    #             return ret
    #     return inner
    #
    # @login
    # def art():
    #     print('欢迎来到文章页')
    #
    # @login
    # def dar():
    #     print('欢迎来到日记页')
    #
    # art()
    # dar()
    View Code
    # def log(func):
    #     def inner(*args,**kwargs):
    #         print('你要调用%s函数了'%func.__name__)
    #         ret = func(*args,**kwargs)
    #         return ret
    #     return inner
    #
    # @log
    # def f1():
    #     print('f1')
    # @log
    # def f2():
    #     print('f2')
    #
    # f1()
    # f2()
    View Code
     
     
     
  • 相关阅读:
    (WPF)实现DataGrid中当某一列的值显示为密码样式
    利用双栈实现撤销与恢复逻辑
    WPF 中ContextMenu 在mvvm模式中的绑定问题
    WPF使用StringFormat绑定
    不注册调用COM组件
    再谈WPF绑定
    WPF的动态资源和静态资源
    MDI窗体(Winform)
    mysql 查询json字符串中符合条件的值
    phpstudy 导入sql到phpmyadmin中sql过大导致失败解决办法
  • 原文地址:https://www.cnblogs.com/dwenwen/p/7772924.html
Copyright © 2020-2023  润新知