zoukankan      html  css  js  c++  java
  • 装饰器

    简单装饰器:

    写代码要遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:

    封闭:已实现的功能代码块

    开放:对扩展开发

    def outer(function):
    def inner():
    print("123")
    ret = function()
    #return ret
    return inner
    @outer
    def f1():
    print("456")
    f1()
    运行后结果123 456
    原理:将函数名f1当作参数传进outer函数执行outer函数 然后再赋值给f1
        f1 =outer(f1) function=f1
        outer函数的返回值是inner函数名 所以f1 = inner
        重新执行f1()就是执行inner() 所以执行完123 后执行456
    可以有多个参数
    def w1(func):
     2     def inner(arg1,arg2,arg3):
     3         # 验证1
     4         # 验证2
     5         # 验证3
     6         return func(arg1,arg2,arg3)
     7     return inner
     8 
     9 @w1
    10 def f1(arg1,arg2,arg3):
    11     print 'f1'

    可以装饰具有处理n个参数的函数的装饰器
    def w1(func):
        def inner(*args,**kwargs):
            # 验证1
            # 验证2
            # 验证3
            return func(*args,**kwargs)
        return inner
     
    @w1
    def f1(arg1,arg2,arg3):
        print 'f1'

    多个装饰器应用到同一个函数
    def outer(function):
    def inner(*args,**kwargs):
    print("123")
    function(*args,**kwargs)
    # return ret
    return inner
    def outer1(function):
    def inner1(*args,**kwargs):
    print("wangyao")
    function(*args,**kwargs)
    return inner1
    @outer
    @outer1
    def f1(a1,a2,a3):
    print("456")
    f1(1,2,3)
    结果是123 wangyao 456
    @outer1被替换成inner1()函数
    再将inner1()函数应用到@outer装饰器中

     
     



  • 相关阅读:
    使用jquery.validate.js实现boostrap3的校验和验证
    MySQL 随机取数据效率问题
    qq在线客服代码
    使用Shell脚本查找程序对应的进程ID,并杀死进程
    Redis-概述
    JVM的类加载机制
    volatile
    java内存相关
    设计模式--模板方法
    设计模式概述
  • 原文地址:https://www.cnblogs.com/wangyao2317072926/p/7691312.html
Copyright © 2011-2022 走看看