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

python闭包、装饰器

时间:2018-03-02 23:16:39      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:全局   实例   日志   性能   only   name   外部   img   div   

 

内部函数

 

闭包:

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

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

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

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

  实例

 技术分享图片

装饰器

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

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

  使用装饰器的情形有:

  ——引用日志

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

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

  装饰器实例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闭包、装饰器

标签:全局   实例   日志   性能   only   name   外部   img   div   

原文地址:https://www.cnblogs.com/ghming/p/8495230.html

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