python闭包装饰器

Posted Guan_zi

tags:

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

 

内部函数

 

闭包:

  闭包将内部函数自己的代码和作用域以及外部函数的作用结合起来。

  闭包的词法变量不属于全局名字空间域或者局部的——而是属于其他的名字空间,带着流浪的作用域。

  闭包对于安装计算,隐藏状态,以及在函数对象和作用域中随意的切换是很有用的。

  闭包也是函数,但是他们能携带一些额外的作用域。

  实例

 

装饰器

  装饰器是在函数调用之上的修饰

  这些修饰是当声明一个函数或者方法的时候,才会应用的额外调用

  使用装饰器的情形有:

  ——引用日志

  ——增加计时逻辑来检测性能

  ——给函数加入事物的能力

  装饰器实例1:设置验证函数,登录前调用登录验证函数

user_status = False
#用户登录后就改变状态为True
user_status = False
#用户登录后就改变状态为True


def login():
username = \'zhangsan\'
password = \'abc123\'
global user_status

if user_status == False:
username1 = input(\'请输入用户名:\')
password1 = input(\'请输入密码:\')

if username==username1 and password==password1:
user_status = True
print(\'用户登录成功!\')
else:
print(\'用户名或密码错误!\')
else:
print(\'用户已登录,验证通过……\')


def home():
print(\'首页\'.center(20,\'-\'))


def america():
if login():#执行前加上验证

print(\'欧美专区\'.center(20,\'-\'))


def japan():
login()#执行前验证
print(\'日韩专区\'.center(20,\'-\'))



home()
america()

 

 

 

装饰器实例2:

  编程原则:

    封闭:已实现的功能代码块不应该被修改

    开放:兑现有功能的扩展开放

user_status = False
#用户登录后就改变状态为True


def login(func):
    username = \'zhangsan\'
    password = \'abc123\'
    global user_status

    if user_status == False:
        username1 = input(\'请输入用户名:\')
        password1 = input(\'请输入密码:\')

        if username==username1 and password==password1:
            user_status = True
            print(\'用户登录成功!\')
        else:
            print(\'用户名或密码错误!\')

    elif user_status == True:
        func()



def home():
    print(\'首页\'.center(20,\'-\'))


def america():

    print(\'欧美专区\'.center(20,\'-\'))


def japan():
    
    print(\'日韩专区\'.center(20,\'-\'))



home()
login(america)
login(japan)

 

装饰器实例3

def login(func):


    def inner():
        username = \'zhangsan\'
        password = \'abc123\'
        global user_status

        if user_status == False:
            username1 = input(\'请输入用户名:\')
            password1 = input(\'请输入密码:\')

            if username==username1 and password==password1:
                user_status = True
                print(\'用户登录成功!\')
            else:
                print(\'用户名或密码错误!\')

        if user_status == True:
            func()
            #如果验证通过,就能调用相应的功能

    return inner


def home():
    print(\'首页\'.center(20,\'-\'))



def america():

    print(\'欧美专区\'.center(20,\'-\'))

@login
def japan():
    print(\'日韩专区\'.center(20,\'-\'))

home()
japan()

 

装饰器实例4 :带参数的函数

user_status = False
#用户登录后就改变状态为True


def login(func):


    def inner(*args, **kwargs):
        username = \'zhangsan\'
        password = \'abc123\'
        global user_status

        if user_status == False:
            username1 = input(\'请输入用户名:\')
            password1 = input(\'请输入密码:\')

            if username==username1 and password==password1:
                user_status = True
                print(\'用户登录成功!\')
            else:
                print(\'用户名或密码错误!\')

        if user_status == True:
            func(*args, **kwargs)
            #如果验证通过,就能调用相应的功能

    return inner


def home():
    print(\'首页\'.center(20,\'-\'))


@login
def america():

    print(\'欧美专区\'.center(20,\'-\'))

@login
def japan(style):#带参数
    print(\'日韩专区\'.center(20,\'-\'))

home()
japan(\'3p\')#调用必须传参
america()

 

装饰器4:增加验证方法,多层嵌套

user_status = False
#用户登录后就改变状态为True


def login(auth_type):

    def auth(func):#把要执行的模块从这里传进来
        def inner(*args, **kwargs):
            if auth_type==\'qq\':
                username = \'zhangsan\'
                password = \'abc123\'
                global user_status

                if user_status == False:
                    username1 = input(\'请输入用户名:\')
                    password1 = input(\'请输入密码:\')

                    if username==username1 and password==password1:
                        user_status = True
                        print(\'用户登录成功!\')
                    else:
                        print(\'用户名或密码错误!\')

                if user_status == True:
                    return func(*args, **kwargs)
                #如果验证通过,就能调用相应的功能
            else:
                print(\'only support qq\')
        return inner
    return auth

def home():
    print(\'首页\'.center(20,\'-\'))


@login(\'qq\')
def america():

    print(\'欧美专区\'.center(20,\'-\'))

@login(\'weibo\')
def japan(style):#带参数
    print(\'日韩专区\'.center(20,\'-\'))

home()
japan(\'3p\')#调用必须传参
america()

 

 

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

python函数下篇装饰器和闭包,外加作用域

python闭包函数装饰器

python闭包与装饰器

python 闭包装饰器

python闭包装饰器

Python之闭包装饰器