Decorator 装饰器 - liudl240/PYTHON3 GitHub Wiki

Decorator 装饰器的简单教程

装饰器不修改函数源代码以及函数的调用方法,新增函数的功能

"""
#装饰器的使用,通过高阶函数,不修改函数源代码,不修改函数的调用方式新增功能
第一个案例,引入修饰符@
    @就相当于test1=aa(test1)
第二个案例,使用修饰符
第三个案例,如何传参数
第四个案例,
"""

def aa(func):
    def demo():
        func()
        print("this is ok")
        print("这是第一个实例结束符".center(50,"#"))
    return  demo

def test1():
    print("hi,james liu")
test1=aa(test1)
test1()


def bb(func):
    def demo():
        func()
        print("this is ok")
        print("这是第二个实例结束符".center(50, "#"))
    return demo

@bb
def test2():
    print("hi ,james")

test2()

def cc(func):
    def demo(*args,**kwargs):
        res=func(*args,**kwargs)
        print("this is ok")
        print("这是第三个实例结束符".center(50, "#"))
        return  res
    return demo
@cc
def test3(name,age):
    info="name:%s,age:%d" %(name,age)
    print(info)
    return  "this is return"

print(test3("james",23))

装饰器带参数,传入

def auth(type):
    def indomo(func):
        if type == "ldap":
            def domo(*args, **kwargs):
                input_username = input("input your username:")
                input_passwd = input("input your  passwd:")
                username = "james"
                passwd = "james"
                if username == input_username and passwd == input_passwd:
                    res=func(*args,**kwargs)
                    print("\033[31mwelcome %s \033[0m".center(50,"#")%(username))
                    return res
                else:
                     print("输入用户名密码错误")
                     sys.exit(10)
        elif type == "sys":
            def domo(*args, **kwargs):
                input_username = input("input your username:")
                input_passwd = input("input your  passwd:")
                username = "james"
                passwd = "james"
                if username == input_username and passwd == input_passwd:
                    res=func(*args,**kwargs)
                    print("\033[31mwelcome %s \033[0m".center(50,"#")%(username))
                    return res
                else:
                     print("输入用户名密码错误")
                     sys.exit(10)
        return domo
    return indomo


def index_pages():
    print("this is index pages".center(50,"#"))

@auth(type="sys")
def home(username):
    print("this is home pages".center(50,"&"))
    return "this is %s home".center(50,"!") %(username)
@auth(type="ldap")
def blog():
    print("this is blog pages".center(50,"@"))


index_pages()
print(home("kebe"))
blog()