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

    python装饰器(其实就是函数对象的复杂应用)

    装饰器两大原则

    1.不修改被装饰对象的源代码
    2.不修改被装饰对象的调用方式

    具体应用场景:如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用方法,这个时候可以使用装饰器。因为软件的维护应该遵循开放封闭原则,即软件一旦上线运行后,软件的维护对修改源代码是封闭的,对扩展功能指的是开放的。

    装饰器的几种实现

    1.简单无参实现

    def outter(func):
        def inner():
            '''在此处添加功能'''
            print("hello")
            func()
        return inner
    def zx():
        print("zx")
    zx=outter(zx)
    zx()
    

    hello
    zx

    2.有参装饰器

    def outter(func):
        def inner(*args,**kwargs):
            '''在此处添加功能'''
            print("hello")
            func(*args,**kwargs)
        return inner
    def zx(a,b):
        print(a,b)
    zx=outter(zx)
    zx("zx","wl")
    

    hello
    zx wl

    3.装饰器语法糖

    def outter(func):
        def inner():
            '''在此处添加功能'''
            print("hello")
            func()
        return inner
    def zx():
        print("zx")
    @outter
    def zx():
        print("zx")
    zx()
    

    hello
    zx

    4.连续装饰器

    def outter1(func):
        def inner1():
            '''在此处添加功能'''
            print("---------")
            func()
            print("---------")
        return inner1
    def outter2(func):
        def inner2():
            '''在此处添加功能'''
            print("111111111")
            func()
            print("111111111")
        return inner2
    @outter1
    @outter2# 先运行最下面的装饰器
    def zx():
        print("zx")
    zx()
    

    ---------
    111111111
    zx

    111111111
    ---------

    等价于(看的时候进入函数看方能看懂)

    def zx():
        print("zx")
    zx=outter2(zx)
    zx=outter1(zx)
    zx()
    

    5.三层装饰器(主要针对增加的功能可能需要外接的参数)

    def wai(x):
        def outter(func):
            def inner():
                print("hello")
                func()
                print(x)
            return inner
        return outter
    @wai("world")
    def zx():
        print("zx")
    zx()
    

    hello
    zx
    world

    等价于

    def zx():
        print("zx")
    aa=wai("world")
    zx=aa(zx)
    zx()
    
  • 相关阅读:
    求所有科目都大于80分的学生姓名
    sql server如何设置密码过期时间呢?
    sql server官网使用查找技术文档(msdn、联机丛书)
    【版本特性】sql server2014版本特性
    SQLSERVER文件组误脱机后如何联机
    sql server2014中的内存优化表/内存表(续写)
    JNI日志调试LOG和中文乱码
    JNI常见错误整理
    什么是“软解码”,什么又是“硬解码”呢?
    创建eclipse针对NDK的联合编译环境。
  • 原文地址:https://www.cnblogs.com/zx125/p/11340411.html
Copyright © 2011-2022 走看看