python 装饰器

Posted 辉辉辉辉a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 装饰器相关的知识,希望对你有一定的参考价值。

1.没有加参数的装饰器

def login(func):#第一次执行login方法时,将老河南的方法保存在了func中

    def inner():#装饰器可以随便加多少参数
        _username = "alex"  # 假装这是DB里存的用户信息
        _password = "abc!23"  # 假装这是DB里存的用户信息
        global user_status

        if user_status == False:
            username = input("user:")
            password = input("pasword:")

            if username == _username and password == _password:
                print("welcome login....")
                user_status = True
            else:
                print("wrong username or password!")
        if user_status:
            print("用户已登录,验证通过...",func)

            func()#此时执行的func为一开始存储的老河南方法
    # print(func)
    # print(inner)
    return inner


def home():
    print("---首页----")


def america():
    print("----欧美专区----")

def japan():
    print("----日韩专区----")

def henan():
    print("----河南专区----")

henan =  login(henan)#此时为inner方法的地址
print(henan)#此时为新河南
henan()#为inner

思路分析:

第一步会执行login(henan)函数,返回inner的内存地址,此时新henan为inner的内存地址,此时的func为老河南的方法。

第二步执行inner函数,当用户名输入正确时会执行func函数,此时执行老河南的方法,最后输出老河南函数中的内容。

 

2.加一个参数的装饰器

Staus = False

def login(func):
    def inner(ss):
        name = "gaohui"
        passwd = "1234"
        global Staus

        if Staus == False:
            username = input("请输入名字:").strip()
            password = input("请输入密码:").strip()

            if username == name and password == passwd:
                #print("欢迎")
                Staus = True
            else:
                print("用户或密码错误")
        if Staus :
            print("欢迎")
            func(ss)
    return inner


@login
def henan(style):
    print("欢迎河南")
@login
def Japan(style):
    print("欢迎日本")
def Afica():
    print("欢迎非洲")

henan("3p")

Japan("4p")

当有些函数只要一个参数,有些参数需要多个参数时,inner中的参数为(*args,**kwargs)

 

 

3.当两个参数的时候

user_status = False  # 用户登录了就把这个改成True



def login(auth_type):

    def auth(func):
        def inner(*args,**kwargs):
            _username = "alex"  # 假装这是DB里存的用户信息
            _password = "abc!23"  # 假装这是DB里存的用户信息
            global user_status

            if user_status == False:
                username = input("user:")
                password = input("pasword:")

                if username == _username and password == _password:
                    print("welcome login....")
                    user_status = True
                else:
                    print("wrong username or password!")
            if user_status:
                print("用户已登录,验证通过...",func)

                func(*args,**kwargs)
        return inner
    return auth

def home():
    print("---首页----")


def america():
    print("----欧美专区----")


def japan():
    print("----日韩专区----")


@login(qq)#henan =  login(‘qq‘)(henan)
def henan(video_type):
    print("----河南专区----",video_type)

henan(3p)

再多加一层函数即可实现。

以上是关于python 装饰器的主要内容,如果未能解决你的问题,请参考以下文章

[TimLinux] Python 装饰器

python装饰器

python装饰器关键代码

Python装饰器

python之装饰器

python 装饰器