码迷,mamicode.com
首页 > 编程语言 > 详细

python 装饰器

时间:2018-05-26 15:26:07      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:als   input   --   def   日本   ret   密码   color   lex   

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 装饰器

标签:als   input   --   def   日本   ret   密码   color   lex   

原文地址:https://www.cnblogs.com/huizaia/p/9089795.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!