开放封闭原则
1.对扩展是开放的
为什么要对扩展开放呢?
我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
2.对修改是封闭的
为什么要对修改封闭呢?
就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
装饰器完美的遵循了这个开放封闭原则。
*args,**kwargs
def f1(*args,**kwargs): 接收函数的时候,*是聚合
print(*args) 执行函数值,*是打散
函数的有用信息
print(f1.__doc__)获取函数的说明信息
print(f1.__name__)获取函数的名字
装饰器已经非常完美了,但是有时我们正常情况下查看函数信息的方法在此处都会失效:
def index(): ‘‘‘这是一个主页信息‘‘‘ print(‘from index‘) print(index.__doc__) #查看函数注释的方法 ##这是一个主页信息 print(index.__name__) #查看函数名的方法 ##index
如何解决呢? 1 from functools import wraps
2 3 def deco(func): 4 @wraps(func) #加在最内层函数正上方 5 def wrapper(*args,**kwargs): 6 return func(*args,**kwargs) 7 return wrapper 8 9 @deco 10 def index(): 11 ‘‘‘哈哈哈哈‘‘‘ 12 print(‘from index‘) 13 14 print(index.__doc__) 15 print(index.__name__)
‘‘‘
哈哈哈哈
index
‘‘‘
装饰器进阶:
带参数的装饰器:
flag = True #带参数的装饰器 def outer(f): def timmer(func): def inner(*args,**kwargs): if f: print(‘‘‘执行函数之前要做的‘‘‘) ret = func(*args,**kwargs) if f: print(‘‘‘执行函数之后要做的‘‘‘) return ret return inner return timmer @outer(flag) #等价于@timmer def func(): print(111) func() ‘‘‘ 执行函数之前要做的 111 执行函数之后要做的 ‘‘‘
多个装饰器装饰一个函数:
def wrapper1(func): #fun = f def inner(): print(‘wrapper1 ,before func‘) func() print(‘wrapper1 ,after func‘) return inner def wrapper2(func): #func = inner1 def inner(): print(‘wrapper2 ,before func‘) func() print(‘wrapper2 ,after func‘) return inner @wrapper2 #f = wrapper2(f)里面的f=inner1外面的f=inner2 @wrapper1 #f = wrapper1(f) 返回inner1 f = inner1 def f(): print(‘in f‘) f() #inner2() ‘‘‘ wrapper2 ,before func wrapper1 ,before func in f wrapper1 ,after func wrapper2 ,after func ‘‘‘