#-*- 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