python-装饰器

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)
原文地址:https://www.cnblogs.com/friday69/p/9293915.html