装饰器(二)

---恢复内容开始---

实现了完整的功能后,还可以对程序做进一步的优化:

user_state = False
name = "sunjing"
password = "123"

def login(func1):
def inner(*args,**kwargs):     #3.此时就可以在inner函数中加一个非固定参数来接收jap()中的参数
global user_state
if user_state == False:
user_name = input("name:")
user_password = input("password:")
if user_name == name and user_password == password:
print("login success")
user_state = True
else:
print("wrong name or password")
if user_state:
func1(*args,**kwargs)   #4.同样,需要在执行原jap()函数时,同样加入非固定参数
return inner

@login
def jap(style):              #1.假如日韩专区下还有分类,需要显示
print("----日韩专区----",style)   #5.此时就可以输出不同的分区了
def america():
print("----欧美专区----")
def homemade():
print("----国产专区----")
def cartoon():
print("----动漫专区----")

jap("BT")                  #2.显示日韩专区下的BT分类

完成后,发现还有要求,需要在登录时确认用微信或QQ登录,于是写下了如下代码:

def login(func):     #此处的func为"QQ"
    def outter(func1):  #此处的func1为jap
        def inner(*args,**kwargs):
            global user_state
            if user_state == False:
                user_name = input("name:")
                user_password = input("password:")
                if user_name == name and user_password == password:
                    print("login success")
                    user_state = True
                else:
                    print("wrong name or password")
            if user_state:
                func1(*args,**kwargs)
        return inner
    return outter

@login("QQ")        #此处可以判断登录时用QQ登录。执行步骤是这样的1.先执行login(“QQ”) 把QQ作为一个参数执行login函数。2.得到返回值outter,把jap作为outter函数的一个参数,执行outter函数      
def jap(style):      #3.得到返回值inner再赋值给jap print("----日韩专区----",style) def america(): print("----欧美专区----") def homemade(): print("----国产专区----") def cartoon(): print("----动漫专区----") jap("BT")          #此时调用jap()函数相当于调用inner()函数,而"BT"相当于inner()的一个参数

这样就完成了对登录方式的要求

原文地址:https://www.cnblogs.com/sunj-96/p/10662667.html