python基础 (装饰器,内置函数)

博客主要围绕Python展开,回顾了闭包知识,介绍了装饰器语法糖、带参数的装饰器,还提及多个装饰器装饰一个函数的情况,同时阐述了开放封闭原则,指出正常查看函数信息的方法在某些装饰器场景会失效,最后提到了内置函数。
https://docs.python.org/zh-cn/3.7/library/functions.html

 

1.闭包回顾

在学习装饰器之前,可以先复习一下什么是闭包?
  在嵌套函数内部的函数可以使用外部变量(非全局变量)叫做闭包!
def wrapper():
    money =10
    def inner(num):
        nonlocal money
        money +=num
        print(money)
    print(inner.__closure__)  #不返回none的话就是闭包
    return inner
wrapper()(100)
复制代码
#不返回none的话就是闭包

 2.装饰器
装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。
#简单的装饰器
def func():
    print('嘻嘻更健康')
def timmer(f):
    def inner():
        start_time = time.time()
        time.sleep(0.1)
        f()
        end_time = time.time()
        print('----> 执行效率%s' % (end_time - start_time))
    return inner
func = timmer(func)  # inner
func() # inner()
这是最简单的装饰器,装饰任何函数,只需要加一句func = timmer(func)
View Code

 3.装饰器语法糖

import time
def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner

@timer  等价于func1 = timer(func1),@timer会先拿到下面函数的名字,然后把拿到名字的函数传给timer装饰器函数
def func1():
    print('in func1')
func1()
View Code
def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer
def func1(a):
    print(a)

func1(1)

装饰器hold带参数

import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func1 = timer(func1)
def func1(a,b):
    print('in func1')

@timer   #==> func2 = timer(func2)
def func2(a):
    print('in func2 and get a:%s'%(a))
    return 'fun2 over'

func1('aaaaaa','bbbbbb')
print(func2('aaaaaa'))
View Code

上面的装饰器已经非常完美了,但是有我们正常情况下查看函数信息的方法在此处都会失效:

from functools import wraps
def deco(func):
    @wraps(func) #加在最内层函数正上方,显示被装饰的函数
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper
@deco
def index():
    '''哈哈哈哈'''
    print('from index')

print(index.__doc__)   #显示被装饰函数的注释
print(index.__name__)  #显示被装饰的函数名
View Code

4.开放封闭原则

开放对扩展代码--->新添加的功能
封闭修改源代码--->不要修改源代码
改变了人家调用方式---->不能改变其原有的调用方式

5带参数的装饰器

假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?
一个一个的取消掉? 没日没夜忙活3天。。。
过两天你领导想通了,再让你加上。。。

def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return re
        return inner
    return timer

@outer(False)
def func():
    print(111)

func()
View Code

6.多个装饰器装饰一个函数

def wrapper1(func):
    def inner():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner
def wrapper2(func):
    def inner():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner
@wrapper2
@wrapper1
def f():
    print('in f')
f()
执行顺序
    wrapper2 ,before func
    wrapper1 ,before func
    in f
    wrapper1 ,after func
    wrapper2 ,after func
View Code

7.内置函数

*****思维导图*****

https://docs.python.org/zh-cn/3.7/library/functions.html

 

文章:https://www.cnblogs.com/eric_yi/p/7255455.html
文章:https://www.cnblogs.com/cicaday/p/python-decorator.html

 

 

 

转载于:https://www.cnblogs.com/jiazeng/p/10555130.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值