装饰器
软件开发中的一个原则:开放-封闭原则。
封闭:已实现的功能代码块不应该被修改
开放:对现有功能的拓展开放。
函数也是一个对象,函数对象可以赋值给一个变量,所以,通过变量也可以调用函数。
函数对象有一个__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()
越是困难的事越要立即去做,这样收益才会最大!!!