一般在开发过程中,要遵循开放封闭原则(OCP),虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展
装饰器:在不改变源代码的情况下,对原来的代码进行扩充
1.下面是一个简单的装饰器
t2在不改变t1的情况下为t1增加了两行输出
def t2(fn):
def t3():
print("+++++++++++++++++++++")
fn()
print("=====================")
return t3
@t2
def t1():
print("---------------------")
t1()
结果如下:
+++++++++++++++++++++
---------------------
=====================
2.被装饰函数有参数:
def logging(fn):
def inner(name):
print("%s 是我女朋友" % name)
fn(name)
return inner
@logging
def login(name):
print("我和%s去年刚结婚" % name)
login("XXX")
运行结果如下:
XXX 是我女朋友
我和XXX去年刚结婚
3.装饰器带参数
带参数的装饰 可以看成两个装饰器 b2下的函数块是一个装饰器 b1的函数块又可以看成一个装饰器
def b1(con1):
print("来看看传入的参数是什么\n %s"%con1)
def b2(fn):
def b3(con3):
print("这是装饰器里的函数,参数和b4一样,参数是%s" % con3)
fn(con3)
return b3
return b2
@b1("我是李云龙")
def b4(con2):
print("我是被装饰函数 传入参数是%s"%con2)
b4("谁是二嘎子")
运行结果是:
来看看传入的参数是什么
我是李云龙
这是装饰器里的函数,参数和b4一样,参数是谁是二嘎子
我是被装饰函数 传入参数是谁是二嘎子
4.多个装饰器
def t1(fn):
print("你愁啥?")
def inner():
print("瞅你咋地")
fn()
print("..")
return inner
def t2(fn):
def inner():
print("您在瞅一下试试")
fn()
print("hehe")
return inner
@t1
@t2
def t3():
print("试试就试试")
t3()
运行结果如下:
你愁啥?
瞅你咋地
您在瞅一下试试
试试就试试
hehe
..
5. 装饰器在函数中的应用
在if...else...语句中
def logging(fn):
t=input("请输入")
if t == "1":
def inner(userName, password):
print("该修空调了 %s %s"%(userName, password))
fn(userName, password)
print("说不需要")
return inner
elif t == "2":
def inner(userName, password):
print("需要我修空调吗? %s %s"%(userName, password))
fn(userName, password)
print("说需要")
return inner
@logging
def login(userName, password):
print(userName, password)
print("笑着")
login("隔壁的","老王" )
运行结果如下:
请输入1
该修空调了 隔壁的 老王
隔壁的 老王
笑着
说不需要