Python 带参数的装饰器

  1. 带参数的装饰器讲解
# !/usr/bin/env python
# -*- coding:utf-8 -*-

# 1、带参数的装饰器
def wrapper_out(parameter):
    print(parameter)

    def wrapper(func):
        def inner(*args, **kwargs):
            ret = func(*args, **kwargs)
            return ret
        return inner
    return wrapper


"""
@wrapper_out('企鹅') 分析解读:
当函数执行到带参数装饰器 @wrapper_out('企鹅') 这句时,分两步执行:
    1.执行wrapper_out('企鹅')这个函数,把相应的参数'微信'传给parameter,并且得到返回值wrapper函数名
    2.将@与wrapper结合,得到我们之前熟悉的标准版的装饰器,按照装饰器的执行流程执行。
"""


@wrapper_out('企鹅')
def qq():
    print('成功登录企鹅!')


qq()

  1. 带参数装饰器的应用
# 2、带参数装饰器应用:
"""
两个不同软件微信和淘宝,有不同的账户和密码,
根据不同软件的登录,写个装饰器验证登录功能
账户文件名:wechat,账户albert|123
账户文件名:taobao,账户don|456
"""


def wrapper_out(parameter):
    def wrapper(func):
        def inner(*args, **kwargs):
            if parameter == 'wechat':
                username = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()
                with open('wechat', encoding='utf-8', mode='r') as f:
                    for line in f:
                        user, pwd = line.strip().split('|')
                        if user == username and pwd == password:
                            ret = func(*args, **kwargs)
                            return ret
                    return False
            elif parameter == 'taobao':
                username = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()
                with open('taobao', encoding='utf-8', mode='r') as f:
                    for line in f:
                        user, pwd = line.strip().split('|')
                        if user == username and pwd == password:
                            ret = func(*args, **kwargs)
                            return ret
                    return False

        return inner
    return wrapper


@wrapper_out('wechat')
def wechat():
    print('成功登录微信!')


wechat()


@wrapper_out('taobao')
def taobao():
    print("成功登录淘宝!!!")


taobao()

  1. 带参数装饰器应用最终版:(优化版)
# 3、带参数装饰器应用:优化版
"""
两个不同软件微信和淘宝,有不同的账户和密码,
根据不同软件的登录,写个装饰器验证登录功能
账户文件名:wechat,账户albert|123
账户文件名:taobao,账户don|456
"""


def wrapper_out(parameter):
    def wrapper(func):
        def inner(*args, **kwargs):
            username = input('请输入用户名:').strip()
            password = input('请输入密码:').strip()
            # 注意文件名需要与装饰器传入参数一致,增强耦合性思想
            with open(parameter, encoding='utf-8', mode='r') as f:
                for line in f:
                    user, pwd = line.strip().split('|')
                    if user == username and pwd == password:
                        ret = func(*args, **kwargs)
                        return ret
                return False
        return inner
    return wrapper


@wrapper_out('wechat')
def wechat():
    print('成功登录微信!')


wechat()


@wrapper_out('taobao')
def taobao():
    print("成功登录淘宝!!!")


taobao()

版权声明:本文为m0_57787326原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。