函数3—装饰器

1 为什么要用装饰器        开放封闭原则  :游戏上线后,尽量避免更改源代码和调用方式,但是出于需求必须为代码增加扩展性

2 什么是装饰器:    本质是一种函数  ,没有改动函数源代码和调用方式的情况下,给函数增加一种新的功能    利用了闭包的原理,闭包的作用就是可以在外部调用这个内部闭包函数,不用关心作用域的问题

3 装饰器的作用原理:将被装饰函数放入装饰器函数内部的一个闭包函数内,再在外部调用闭包函数

函数嵌套------->闭包---------->装饰器
#无参装饰器(被装饰函数无参)import timedef timmer(func):    def wrapper():        # 闭包函数        start = time.time()        func()              # 闭包函数内调用被装饰函数        stop = time.time()        print(‘run time is %s‘%(stop - start))    return wrapper        # 返回闭包函数

@timmer    #index = timmer(index)  装饰器语法def index():    print(‘welcome to oldboy!‘)

index()   # 调用的是装饰后的函数  即 装饰器timmer的返回值wrapper 函数

#无参装饰器(被装饰函数有参数)import timefrom functools import wrapsdef timmer(func):    @wraps(func)             #查看函数注释时查看的是被装饰函数的注释信息    def wrapper(*args,**kwargs):        ‘计算运行时间‘        start = time.time()        abc = func(*args,**kwargs)    # my_max(1,2)    abc = res = 2        stop = time.time()        print(‘run time is %s‘%(stop - start))        return abc    return wrapper

@timmer        #my_max = timmer(my_max)def my_max(x,y):    ‘比较大小‘    print(‘my_max function‘)    res = x if x > y else y    return res

#my_max(1,2)ggg = my_max(1,2)         # ggg = abc = 2print(‘=============>‘,ggg)print(my_max.__doc__)                #查看注释信息#无参装饰器(用于多个参数不确定的函数的装饰器)import timedef timmer(func):    def wrapper(*args,**kwargs):        start = time.time()        func(*args,**kwargs)        stop = time.time()        print(‘run time is %s‘%(stop - start))    return wrapper@timmerdef home(name):    time.sleep(2)    print(‘welcome to %s home page‘%name)

@timmerdef auth(name,passwd):    print(name,passwd)

@timmerdef tell():    print(‘-----------------‘)

home(‘drogen‘)auth(‘egon‘,123)tell()

#有参装饰器def auth2(auth_type):        def auth(func):            def wrapper(*args,**kwargs):                if auth_type == ‘file‘:                    name = input(‘username:  ‘)                    passwd = input(‘passwd:  ‘)                    if name == ‘egon‘ and passwd == 123:                        print(‘auth successful‘)                        func(*args,**kwargs)                    else:                        print(‘auth error‘)

elif auth_type == ‘sql‘:                    print(‘还不会呢‘)

return wrapper        return auth

@auth2(auth_type = ‘sql‘)     # @auth       index= auth(index) 执行了两个函数 auth2 和 authdef index():    print(‘welcome to index page‘)

index()   # 相当于执行函数wrapper

#函数的多个装饰器

current_login = {‘name‘:None,‘login‘:False}

import timedef timmer(func):    def wrapper():        start = time.time()        abc = func()        stop = time.time()        print(‘run time is %s‘%(stop - start))        return abc    return wrapper

def auth2(auth_type):        def auth(func):            def wrapper(*args,**kwargs):                if current_login[‘name‘] and current_login[‘login‘]:                    func(*args,**kwargs)                if auth_type == ‘file‘:                    name = input(‘username:  ‘)                    passwd = input(‘passwd:  ‘)                    if name == ‘egon‘ and passwd == ‘123‘:                        print(‘auth successful‘)                        func(*args,**kwargs)                        current_login[‘name‘] = name                        current_login[‘login‘] = True                    else:                        print(‘auth error‘)

elif auth_type == ‘sql‘:                    print(‘还不会呢‘)

return wrapper        return auth

@timmer     #index= time(index)        index= time(wrapper_xia)    index= wrapper_shang@auth2(auth_type = ‘file‘)       #@auth        index = auth(index)      index = wrapper_xiadef index():    print(‘welcome to index page‘)

@auth2(‘file‘)def home():    print(‘hhhhhhhhhhhhhhhhhhhhh‘)

index()       #index() = warpper_shang(wrapper_xia())home()

装饰器应用1、定义无参装饰器,为被装饰函数添加统计运行时间的功能
import timedef timer(func):    def wrapper():        start = time.time()        func()        stop = time.time()        print(‘run time is %s‘%(stop - start))    return wrapper

@timerdef bbb():    print(‘瞎逼逼‘)bbb()

2、定义有参装饰器,为被装饰函数添加认证功能:用户信息的来源可以是文件也可以是用户管理系统,三次验证失败锁定用户

black_list = []def auth2(auth_type):    def auth(func):        def wrapper():            if auth_type == ‘file‘:                while True:                    name = input(‘name :‘)                    if name == ‘q‘:                        exit()                    passwd = input(‘password :‘)                    with open(‘black_file1‘, encoding=‘utf8‘)as f2:                        y = f2.read()                        if name not in y:                            with open(‘account info‘, encoding=‘utf8‘)as f1:                                    x = eval(f1.read())                                    if name in x and passwd == x[name]:                                        print(‘login successful‘)                                        func()                                        break                                    elif name not in x:                                        print(‘not found‘)                                    else:                                        black_list.append(name)                                        black_list.count(name)                                        if black_list.count(name) > 2:                                            with open(‘black_file1‘, ‘a+‘, encoding=‘utf8‘)as f2:                                                f2.write(name)                                                print(‘name locked!‘)                                                break                                        print(‘login error‘)                        else:                            print(‘name has locked‘)            elif auth_type == ‘ldap‘:                print(‘还他妈不会!‘)        return wrapper    return auth

@auth2(auth_type = ‘file‘)def home():    print(‘welcome to home page‘)home()

思路分析# 登录验证时,将黑名单里面的信息读出,与用户输入进行匹配#将账户信息里面的字典用eval读出,再将用户输入的与字典的键进行匹配

#登录错误时,将错误的用户名放入列表,计算列表相同元素的个数,超过3次写入黑名单
 
时间: 2024-08-09 16:28:17

函数3—装饰器的相关文章

python day4笔记 常用内置函数与装饰器

1.常用的python函数 abs             求绝对值 all               判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any             判断迭代器中的数据是否有一个为真,有返回真,可迭代数据为空或者没有真,返回假 bin             转换整数为二进制字符串 hex            转换整数为十六进制字符串 oct             转换整数为八进制字符串 bool           转换数据为布尔值

python函数、装饰器、迭代器、生成器

5月21日,请假结婚,然后性格惰性来了,不怎么想看视频和笔记,性格中的弱点开始出现,开始做的不错,渐渐开始松懈,直至放弃--- 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递,它的应用形式也被称为高阶函数,函数的特性如下: a. 可以被引用 1 # def foo(): 2 # print('from foo') 3 # 4 # func = foo

Python函数之装饰器

装饰器 一.装饰器的意义 比如:以下函数是供我们调用的,但是我们需要在每个函数中都添加同一个功能,该如何做到呢? 对于函数开放封闭原则,我们一般不允许修改.所以我们引入了装饰器: def outer(func): def inner(): print("添加在原函数之前") r = func() #保留原函数的返回值 print('添加在原函数之后') return r #将保留的返回值返回回去 return inner @outer #等价于f1 = outer(f1) def f1

Python函数加工厂-装饰器

引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * r return s 调用s函数:输入4,输出半径为4的圆的面积.a相当于面积的容器 a = s(4) print(a) 2.装饰器是用来装饰函数的函数.其需要输入的原材料为某个函数 以下是装饰器的固定格式: 1 def timer(func): 2 def inner(*args,**kwarg

python学习笔记之函数总结--高阶函数以及装饰器

python学习笔记之函数总结--高阶函数以及装饰器 Python特点: 1.不是纯函数式编程(允许变量存在): 2.支持高阶函数(可以传入函数作为变量): 3.支持闭包(可以返回函数): 4.有限度的支持匿名函数: 高阶函数: 1.变量可以指向函数: 2.函数的参数可以接收变量: 3.一个函数可以接收另一个函数作为参数: 下面我将示例一些函数的写法以及使用,并说明python中函数的特性: 1.基本的高阶函数示例: #!/usr/bin/env python def func():      

高阶函数和装饰器

函数式:一种编程范式 纯函数式编程:没有变量,支持高阶函数编程 Python不是纯函数式编程语言,支持高阶函数编程 变量可以指向函数,函数名就是指向函数的一个变量,与普通变量没有区别 高阶函数:能接收函数做参数的函数. map():是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. def f(x): return x*x print map(f, [1, 2, 3, 4, 5, 6, 7

python学习笔记4:高阶函数,装饰器,生成器,迭代器

一.高级函数1.把一个函数名当作实参传给另一个函数2.返回值包含函数名>>> def bar():... print ("in the bar")... >>> def foo(func):... res=func()... return res... >>> foo(bar)in the bar 二.嵌套函数在函数中定义另一个函数 三.装饰器装饰器本质上是函数,作用是装饰其他函数,就是为其他函数添加附加功能.原则1:不能修改被装饰

五、python函数、装饰器、内置函数、json及模块

一.递归调用 1.一个函数自己调用自己就是递归调用,最多一个函数递归调用自己999次,超过就会出错2.递归必须有一个明确的结束条件3.每次进入更深一层递归时,问题规模相比上次递归都应有所减少4.递归效率不高,少用递归 eg:def test1(): num = int(input('please enter a number:')) if num%2==0:#判断输入的数字是不是偶数 return True #如果是偶数的话,程序就退出了,返回true print('不是偶数请重新输入!') r

python函数作用域+装饰器

今天记录的是一个小小的知识点 ->函数作用域+装饰器: LEGB:L>E>G>B L;local函数内部作用域 E:enclosing函数内部与内嵌函数之间 G:global全局作用域 B:build-in内置作用域 Coding && Result: 闭包(Closure):内部函数中对enclosing作用域的变量进行引用. 闭包的作用: 1)封装 2)代码复用 函数的实质和属性: 1)函数是一个对象 2)函数执行完成之后内部变量回收 3)函数是对象就有属性 4