python闭包、装饰器

摘要:
在登录前调用登录验证函数user _ Status=False#用户在登录后将状态更改为Trueuser _ Status=False#登录后,用户将状态更改成Truedelogin():#添加验证打印('European and America zone'。center(20,login())#验证打印('日本和韩国zone'。center,

内部函数

闭包:

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

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

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

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

  实例

 python闭包、装饰器第1张

装饰器

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

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

  使用装饰器的情形有:

  ——引用日志

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

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

  装饰器实例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()

 python闭包、装饰器第2张

python闭包、装饰器第3张

装饰器实例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)

python闭包、装饰器第4张

装饰器实例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()

python闭包、装饰器第5张

装饰器实例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()

python闭包、装饰器第6张

装饰器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闭包、装饰器第7张

免责声明:文章转载自《python闭包、装饰器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(转载)Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议Linux 版本控制工具之rabbitvcs下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C/C++头文件一览

C/C++头文件一览 //////////////////////////////////////////////////////////////////////////C头文件(C89,C95)(C++98,C++03也包含) include <assert.h>    //诊断库include <ctype.h>     //...

用jq中jSignature做手动签名

<!DOCTYPE html><html lang="zh-CN"><head> <title>手写板签名demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <...

Protobuf + gRPC Android Studio接入指南

  一.添加protobuf-gradle-plugin插件 1.项目根目录build.gradle里添加: buildscript { repositories { mavenCentral() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-pl...

pymysql完成数据的查询操作

import pymysql # 创建连接对象 conn = pymysql.connect(host='localhost', port=3306, user='root', password='mysql',database='python', charset='utf8') # 获取游标对象 cursor = conn.cursor() # 查...

使用 ejs 渲染数据库中的数据

const http = require('http'); const Router = require('./Router') const {MongoClient} = require('mongodb') const ejs = require('ejs') const queryString = require('querystring') co...

做个开源博客学习Vite2 + Vue3 (四)实现博客功能

我们再来看一下管理类的设计。 Composition API,就是组合API的意思,那么是不是应该把js代码分离出来,做成独立的管理类的形式呢? 这样代码可以更整洁一些,主要是setup里面的代码就不会乱掉了。 管理类 import webSQLHelp from '../store/websql-help' import { blog, blogForm...