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()
    
  • 相关阅读:
    fedora/centos7防火墙FirewallD详解
    python for dl
    神经网络画图工具
    卷积神经网络的复杂度分析
    如何理解深度学习中的Transposed Convolution?
    吴恩达课程及视频笔记汇总
    从LeNet-5到DenseNet
    WPS for Linux
    caffe:fine-tuning
    python下图像读取方式以及效率对比
  • 原文地址:https://www.cnblogs.com/zx125/p/11340411.html
Copyright © 2011-2022 走看看