装饰器

装饰器

在符合软件开发的原则上,给代码加一些功能。

软件开发中的一个原则“开放-封闭”原则,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:

  • 封闭:已实现的功能代码块不应该被修改
  • 开放:对现有功能的扩展开放

原程序(假设是一个视频网站的后端开发工程师)

def home():
    print("---首页----")
   
def vip():
    print("----vip专区----")

def moive():
    print("----电影专区----")

def TV():
    print("----电视剧----")  

现想对几个板块内容进行收费,只有vip才能观看相应区域

flag = False
def login(func):
    def inner():
        username = "alex"
        password = "123"
        global flag
        if flag == False:
            name = input("username:")
            pw = input("password;")
            if name == username and pw == password:
                print("welcome %s....."%name)
                flag = True
            else:
                print("Wrong username or password")
        else:
            print("User is logged in")
        if flag:
            func()
    return inner


def home():
    print("---首页----")
@vip    # 等同于 vip = login(vip)
def vip():
    print("----vip专区----")

def moive():
    print("----电影专区----")

def TV():
    print("----电视剧----")

vip()  #inner

带参数装饰器

flag = False
def login(func):
    def inner(*args,**kwargs):
        username = "alex"
        password = "123"
        global flag
        if flag == False:
            name = input("username:")
            pw = input("password;")
            if name == username and pw == password:
                print("welcome %s....."%name)
                flag = True
            else:
                print("Wrong username or password")
        else:
            print("User is logged in")
        if flag:
            func(*args,**kwargs)
    return inner


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

@login
def vip(style):
    print("----vip专区----",style)

def moive():
    print("----电影专区----")

def TV():
    print("----电视剧----")

vip("music")
TV()

要允许用户选择用qqweiboweixin认证

flag = False
def login(auth_type):
    def outer(func):
        def inner(*args,**kwargs):
            username = "alex"
            password = "123"
            global flag
            if flag == False:
                name = input("username:")
                pw = input("password;")
                if name == username and pw == password:
                    print("welcome %s....."%name)
                    flag = True
                else:
                    print("Wrong username or password")
            else:
                print("User is logged in")
            if flag:
                func(*args,**kwargs)
        return inner
    return outer


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

@login('wx')
def vip(style):
    print("----vip专区----",style)

def moive():
    print("----电影专区----")

@login('qq')
def TV():
    print("----电视剧----")

vip("music")
TV()
原文地址:https://www.cnblogs.com/fantsaymwq/p/9597114.html