装饰器
软件开发中的一个原则:开放-封闭原则。
封闭:已实现的功能代码块不应该被修改
开放:对现有功能的拓展开放。
函数也是一个对象,函数对象可以赋值给一个变量,所以,通过变量也可以调用函数。
函数对象有一个__name__属性,可以得到函数的名字。
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。本质上,装饰器就是一个返回函数的高阶函数。
def func():
print("so good")
name = func
name()
print(func.__name__) print(name.__name__)
下面两个输出结果为: func
user_status = False
def login(func): #func是内存地址
user_name = "alex"
password = "123"
global user_status
if user_status == False:
user_name = input("请输入用户名:")
password = input("请输入密码:")
if user_name == "alex" and password == "123":
print("欢迎登陆")
user_status = True
else:
print("用户名或密码错误")
if user_status == True:
func()
def home():
print("---首页---")
def america():
# login() #不能在函数内部调用,可能会出错。不符合开放封闭原则。
print("---欧美专区---")
def japan():
print("---日韩专区---")
def henan():
# login()
print("---河南专区---")
america = login(america)
henan = login(henan) #不经过调用也会直接执行了函数,我们需要的是用户调用时才执行。
下面引入了嵌套函数
user_status = False
def login(func):
def inner():
user_name = "alex"
password = "123"
global user_status
if user_status == False:
user_name = input("请输入用户名:")
password = input("请输入密码:")
if user_name == "alex" and password == "123":
print("欢迎登陆")
user_status = True
else:
print("用户名或密码错误")
if user_status == True:
func()
return inner #返回inner函数的地址
def home():
print("---首页---")
def america():
# login()
print("---欧美专区---")
def japan():
print("---日韩专区---")
@login #等同于 henan = login(henan)
def henan():
# login()
print("---河南专区---")
henan()
越是困难的事越要立即去做,这样收益才会最大!!!
浙公网安备 33010602011771号