装饰器原理
1.1什么是装饰器:装饰器是由函数去生成的,用于装饰某个函数或方法或类,他可以让这个函数在执行之前或者执行之后做一些操作
实际例子:
先定义一个函数 func
def func(arg):
print(arg)
func('hello world')
*************执行结果为打印 hello world***************
现在在执行func 函数前后执行一些操作,就可以建立一个装饰器来实现:
PS:(这可是一个完美的装饰器),背下来 以后用就往里套就可以了
def decorator(func):#创建 一个装饰器函数,接受的参数arg参数就是func函数名 def inner(*args,**kwargs): print('执行函数之前要添加的函数') ret=func(*args,**kwargs) return ret return ret @decorator#语法糖 如果 要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名 def func(arg): print(arg): fucn('hello world')装饰装饰千
装饰之后输出结果为:
执行函数之前加的代码
hello world
执行函数之后加的代码
**********************
这就是一个能hold住所有函数传参的装饰器
开放封闭原则
1.2对扩展是开放的,我们允许 代码的扩展和添加新的功能
1.3对修改是封闭的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
扩展项:多个装饰器装饰同一个函数
def wrapper1(func): def inner(): print('wrapper1 ,before func') func() print('wrapper1 ,after func') return inner def wrapper2(func): def inner(): print('wrapper2 ,before func') func() print('wrapper2 ,after func') return inner @wrapper2 @wrapper1 def f(): print('in f') f() 多个装饰器装饰同一个函数
扩展项:带开关的装饰器
你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?
def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函数之前要做的''') re = func(*args,**kwargs) if flag: print('''执行函数之后要做的''') return re return inner return timer @outer(False) def func(): print(111) func() 带参数的装饰器开关