
装饰器和"开放-封闭"原则
"开放-封闭"原则
- 软件开发中的“开放-封闭”原则,它规定已经实现的功能代码不应该被修改,但可以被扩展,即:
- 封闭:已实现的功能代码块不应该被修改
- 开放:对现有功能的扩展开放
需求:
编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件)
要求登录成功一次,后续的函数都无需再输入用户名和密码
文件:
test10.txt
False,alex,abc123
程序:
import time
def save_back_to_filr(f, line):
import os
f_name = f
f_name_new = "%s.new" %f_name
f = open(f_name, "r", encoding="utf-8")
f_new = open(f_name_new, "w", encoding="utf-8")
for line in f:
new_line = line.replace("False", "True")
f_new.write(new_line)
f.close()
f_new.close()
os.replace(f_name_new,f_name)
def run_time(func):
def inner():
start = time.time()
func()
total_times = time.time()-start
print(f"Total run_times:{total_times}s")
return inner
def login(func):
def inner():
f = open("test10_data.txt", "r", encoding="utf-8")
line = f.readline()
f.close()
if "False" in line:
username = input("Username:").strip()
password = input("Password:").strip()
if username in line and password in line:
print("登录成功.....")
line = line.replace("False","True")
save_back_to_filr("test10_data.txt", line)
#func()
else:
print("wrong username or password")
if "True" in line:
func()
return inner
def menu():
print("----首页-----")
@login
@run_time
def func1():
print("----欢迎使用func1函数----")
time.sleep(1)
@login
@run_time
def func2():
print("----欢迎使用func2函数----")
time.sleep(1)
@login
@run_time
def func3():
print("----欢迎使用func3函数----")
menu()
func1()
func2()
func3()
@login 这个符号用在功能函数func1前,相当于 func1 = login(func1)
此时 @login装饰func1函数,即所谓的装饰器
只不过,这用了两个装饰器,@login和@run_time
装饰器就是通过闭包达到不改变源代码,来拓展函数应用功能的