python—装饰器
在符合开放-封闭的前提下,增加新功能
- 封闭:已实现的功能代码块不应该被修改
- 开放:对现有功能的扩展开放
要求:在不改变原来代码的前提下,增加登录功能
# *_*coding:utf-8 *_*
user_status = False #用户登录了就把这个改成True
def login(func):
_username = "alex" #假装这是DB里存的用户信息
_password = "123" #假装这是DB里存的用户信息
global user_status
while not user_status:
username = input("user:")
password = input("pasword:")
if username == _username and password == _password:
user_status = True
print('登录成功!')
else:
print('登录失败!')
if user_status == True:
func()
def home():
print("---首页----")
def movie():
# login() #执行前加上验证
print("----电影----")
def cartoon():
print("----动漫----")
def game():
# login() #执行前加上验证
print("----游戏----")
game = login(game)
# 这个时候发现,还没有 调用 home() 的时候程序就已经执行了,因为= 右边 login(home) 的时候,会让函数执行,怎么办?
为了不改变原来的调用方式: game()
我们使用 game = login(game)的方式重新赋值,但是发现这个时候程序已经执行了,所以,再内嵌一个函数
# *_*coding:utf-8 *_*
user_status = False #用户登录了就把这个改成True
def login(func):
def inner():
_username = "tt" # 假装这是DB里存的用户信息
_password = "123" # 假装这是DB里存的用户信息
global user_status
while not user_status:
username = input("user:")
password = input("pasword:")
if username == _username and password == _password:
user_status = True
print('登录成功!')
else:
print('登录失败!')
if user_status == True:
func()
return inner
def home():
print("---首页----")
def movie():
# login() #执行前加上验证
print("----电影----")
def cartoon():
print("----动漫----")
# @login #等价于 henan = login(game) 相当于,把 game 当做参数传入 login()
def game():
print("----游戏----")
#game = login(game)
game()
装饰器
........
# @login #等价于 henan = login(game) 相当于,把 game 当做参数传入 login()
def game():
print("----游戏----")
............
等价于
...........
def game():
print("----游戏----")
game = login(game)
...........
接下来,我们要给装饰器加参数:
user_status = False #用户登录了就把这个改成True
def login(func):
def inner(*args, **kwargs):
_username = "tt" # 假装这是DB里存的用户信息
_password = "123" # 假装这是DB里存的用户信息
global user_status
while not user_status:
username = input("user:")
password = input("pasword:")
if username == _username and password == _password:
user_status = True
print('登录成功!')
else:
print('登录失败!')
if user_status == True:
func(*args, **kwargs)
return inner
def home():
print("---首页----")
def movie():
# login() #执行前加上验证
print("----电影----")
def cartoon():
print("----动漫----")
@login #等价于 henan = login(game) 相当于,把 game 当做参数传入 login()
def game(*args, **kwargs):
print("----游戏----",args)
# game = login(game)
game('合金弹头','火影OL')
打印结果:
user:tt
pasword:123
登录成功!
----游戏---- ('合金弹头', '火影OL')
再加一层:
# *_*coding:utf-8 *_*
# 登录时候要加认证
user_status = False #用户登录了就把这个改成True
def login(auth_type):
def auth(func):
def inner(*args, **kwargs):
_username = "tt" # 假装这是DB里存的用户信息
_password = "123" # 假装这是DB里存的用户信息
global user_status
while not user_status:
username = input("user:")
password = input("pasword:")
if username == _username and password == _password:
user_status = True
print('登录成功!')
else:
print('登录失败!')
if user_status == True:
func(*args, **kwargs)
return inner
return auth
def home():
print("---首页----")
def movie():
# login() #执行前加上验证
print("----电影----")
def cartoon():
print("----动漫----")
@login('wechat') #等价于 xx = login('wechat') game = xx(game)
def game(*args, **kwargs):
print("----游戏----",args)
# xx = login('wechat')
# game = xx(game)
game('王者荣耀')
#打印结果:
user:tt
pasword:123
登录成功!
----游戏---- ('王者荣耀',)
@login('wechat') #等价于 xx = login('wechat') game = xx(game)
def game(*args, **kwargs):
print("----游戏----",args)
@login,表示先调用 login() ,调用之后返回了一个 函数auth ,然后就相当于这个时候变成了
@auth #@auth 会调用 auth函数,把game作为参数传进去 — auth(game)
def game(*args, **kwargs):
print("----游戏----",args)