开放封闭原则:
扩展是开放的(增加新功能)
修改源码是封闭的(修改已经实现的功能)
在不改变源代码及调用方式的基础下额外增加新的功能
装饰器:用来装饰的工具
版1:
import time
start_time = time.time()
def func():
time.sleep(2) # 睡眠(模拟网络延迟)
print("飞")
func()
print(time.time() - start_time)
版2:
import time
def times(f):
start_time = time.time()
f()
print(time.time() - start_time)
def func():
time.sleep(2) # 睡眠(模拟网络延迟)
print("飞")
times(func)
版3.1
import time
def times(f):
start_time = time.time()
f()
print(time.time() - start_time)
def func():
time.sleep(2) # 睡眠(模拟网络延迟)
print("飞")
s = func
func = times
func(s)
版3.2(装饰器1.0)
import time
def times(f):
def inner():
start_time = time.time()
f()
print(time.time() - start_time)
return inner
def func():
time.sleep(2) # 睡眠(模拟网络延迟)
print("飞")
func = times(func)
func() # inner()
版4(装饰器2.0)
import time
def times(f):
def inner(*args, **kwargs):
start_time = time.time()
f(*args, **kwargs)
print(time.time() - start_time)
return inner # 切记:不要加括号
def func(*args, **kwargs):
time.sleep(2) # 睡眠(模拟网络延迟)
print(f"飞 {args, kwargs}")
func = times(func)
func("yulin", 1, 2, 3) # inner("yulin", 1, 2, 3)
版5:语法糖 -- 甜
语法糖必须放在被装饰的函数的正上方
import time
def times(f):
def inner(*args, **kwargs):
start_time = time.time()
f(*args, **kwargs)
print(time.time() - start_time)
return inner # 切记:不要加括号
@times # func = times(func)
def func(*args, **kwargs):
time.sleep(2) # 睡眠(模拟网络延迟)
print(f"飞 {args, kwargs}")
@times # foo = times(foo)
def foo(*args, **kwargs):
time.sleep(1)
print(f"隐身{args, kwargs}")
func("yulin", 1, 2, 3)
foo("yilin", 3)
实战:
login_dic = {
"username": None,
"flag": False
}
def auth(f):
def inner(*args, **kwargs):
if login_dic["flag"]:
return f()
else:
return login()
return inner
@auth
def index():
print(f"这是个{login_dic['username']}的主页")
return "主页没有内容"
def login():
print("这是一个登录页面")
user = input("username:")
pwd = input("password:")
if user == "yulin" and pwd == "123":
login_dic["flag"] = True
login_dic["username"] = user
return "登陆成功"
else:
return "用户名或密码错误!"
@auth
def comment():
print(f"这是{login_dic['username']}评论")
while not login_dic["flag"]:
print(comment())
最终版
login_dic = {
"username": None,
"flag": False,
"count": 3
}
def auth(f):
def inner(*args, **kwargs):
if login_dic["flag"]:
f()
else:
login(f) # f == comment
return inner
@auth
def index():
print(f"这是个{login_dic['username']}的主页")
return "主页没有内容"
def login(func=False):
while login_dic["count"]:
print("这是一个登录页面")
user = input("username:")
pwd = input("password:")
if user == "yulin" and pwd == "123":
login_dic["flag"] = True
login_dic["username"] = user
login_dic["count"] = 0
print("登陆成功")
if func:
func()
else:
login_dic["count"] -= 1
print(f"用户名或密码错误!剩余次数{login_dic['count']}")
@auth
def comment():
print(f"这是{login_dic['username']}评论")
comment()