Python面向对象编程-装饰器
一、装饰器
1、定义及作用
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的应用有插入日志、增加计时逻辑来检测性能、加入事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。
概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
开放封闭原则:
封闭:已实现的功能代码不应该被修改。
开放:对现有功能的扩展开放。
2、装饰器函数
a、⾃动执⾏outer函数并且将其下⾯的函数名f1当作参数func;
b、将outer函数的返回值(变量或者是函数),重新赋值给func;
c、⼀旦结合装饰器后,调⽤f1其实执⾏的是inner函数内部,原来的func被覆盖;
d、⼀旦这个函数被装饰器装饰之后,被装饰的函数重新赋值成装饰器的内层函数。
1 def outer(func): #装饰器函数 f1=func 2 def inner(): 3 print("not ok") 4 func() 5 return inner #inner即时内层inner函数的对象,也是f1函数的对象 6 7 @outer 8 def f1(): #被装饰的函数 9 print("ok") 10 f1()
运行结果如下:
not ok
ok
Process finished with exit code 0
执行顺序:先执行outer的函数-->再执行内部函数inner-->下来执行到inner函数的返回值-->再具体到inner的函数,执行inner函数里面的表达式。
怎么理解?
a、开放封闭原则,这个时候使用装饰器。
b、在Python里面,一切皆对象,那么被装饰的函数本质上就是装饰器函数的形参。
综合应用:新增一个访问后台系统的功能,使用装饰器
dict1={"isLogin":True}
def outer(func): #装饰器函数 admin=func
def inner():
if dict1["isLogin"]==True:
func()
else:
return print("请登陆!")
return inner
def login(username="Lucy",password=123):
if username=="Lucy" and password==123:
return print("login success!")
else:
dict1["isLogin"] = False
return print("账户或密码错误!")
@outer
def admin(): #被装饰的函数
print("访问后台系统")
#通过控制台访问
while True:
p=int(input("1、登陆 2、后台系统\n"))
if p==1:
login()
elif p==2:
admin()
else:
break
运行结果如下:
1、登陆 2、后台系统
1
login success!
1、登陆 2、后台系统
2
访问后台系统
1、登陆 2、后台系统
3
Process finished with exit code 0