装饰器(入门)

#-*- coding:utf-8 -*-
#开放封闭原则(面向对象),尽量不要修改函数里面的内容(函数可能会被很多方法调用),尽量在外部处理。
#装饰器可意在函数之前或者函数返回之后调用

#装饰器
def s1(func):
    def inner():
        print("hello")
        r =func()
        print("word")

        return r
    return inner
@s1
def f1():
    print("1")


def f2():
    print("2")

def f3():
    print("3")

def f4():
    print("4")


f1()
f2()
f3()
f4()

结果:

hello
1
word
2
3
4

解析原理:

def s1(func):
    def inner():
        print("hello")
        r =func()
        print("word")

        return r
    return inner

#@执行s1函数,并将f1函数的名字当参数传递
#2 将s1的返回值inner赋值给f1,等同于f1=inner 
#3inner中函数过程就很简单了,r执行的就是f1函数,最后返回r的结果
@s1
def f1():
    print("1")
#将原函数封装在一个新的函数里面,主要就是将变量的指针指向了一个新的值
多个装饰器代码:

def
s2(func): def inner1(): print("11111") r =func() print("22222") return r return inner def s1(func): def inner(): print("hello") r =func() print("word") return r return inner @s2 @s1 def f1(): print("1")

 结果:

11111
hello
1
word
22222
2
3
4

多个装饰器的原理可以记住下个图:

 手动实现装饰器

def s1(func):
    def inner():
        print("hello")
        r =func()
        print("word")

        return r
    return inner

def f1():
    print("1")

f1=s1(f1)  #装饰器这里就是将变指针改成新的函数指针,新函数返回相应的结果即可
print(f1())  

 结果:

hello
1
word
None

def s2(func):
    def inner1():
        print("11111")
        r =func()
        print("22222")

        return r
    return inner1

def s1(func):
    def inner():
        print("hello")
        r =func()
        print("word")

        return r
    return inner

def f1():
    print("1")

f2=s2(s1(f1))  #这么写跟用@是一个意思。s2接受s1的地址,s1接受f1的地址,f2()正常调用函数
print(f2())

显示结果:

11111
hello
1
word
22222
None

原文地址:https://www.cnblogs.com/menkeyi/p/6725098.html