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()
posted @ 2019-08-12 15:25  zx125  阅读(176)  评论(0编辑  收藏  举报