allbet代理:Python3 装饰器剖析

admin 2个月前 (07-18) 科技 38 0

第6章 函数

  • 6.1 函数的界说和挪用
  • 6.2 参数通报
  • 6.3 函数返回值
  • 6.4 变量作用域
  • 6.5 匿名函数(lambda)
  • 6.6 递归函数
  • 6.7 迭代器
  • 6.8 生成器
  • 6.9 装饰器

6.9 装饰器

装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需做任何代码修改的前提下增添分外功效,它也不会改变函数或类的挪用方式。

它经常用于有切面需求的场景,好比:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。有了装饰器,我们就可以抽离出大量与函数功效自己无关的相同代码到装饰器中并继续重用。

归纳综合的讲,装饰器的作用就是为已经存在的工具添加分外的功效。

装饰器的语法是将@装饰器名,放在被装饰工具上面。

有两类装饰器:函数装饰器、类装饰器

# 函数装饰器的语法
@dec
def func():
    paSs
参数说明:
@称为语法糖
dec:装饰器名字
func:被装饰的函数名

在先容装饰器之前,先明确几个观点及原则:

原则:

Python程序是从上往下顺序执行的,而且碰着函数的界说代码块是不会立刻执行的,只有等到该函数被挪用时,才会执行其内部的代码块。

若是一个函数界说了两次,那么后面界说的会笼罩前面的界说。

在Python中代码的放置位置是有区其余,不能随意摆放,通常函数体要放在挪用的语句之前。

观点:

函数名、函数体、返回值,函数的内存地址、函数名加括号、函数名被看成参数、函数名加括号被看成参数、返回函数名、返回函数名加括号。

# 加操作:无参数
import time


def timer(func):
    def inner():
        t1 = time.time()
        func()
        t2 = time.time()
        return t2 - t1

    return inner


@timer
def add():
    a = 1
    b = 1
    time.sleep(1)
    c = a + b
    print(c)
    return c


add = add()
print(add)

函数名: timeraddinner

函数体:除def那一行外的部门

返回值: return后面的表达式

函数的内存地址:id(add)id(outer)等等

函数名加括号:对函数举行挪用,好比add()timer(func)

函数名作为参数: timer(func)中的func自己是个函数,但作为参数被通报给了timer函数

函数名加括号被当做参数:实在就是先挪用函数,再将它的返回值当做其余函数的参数,例如timer(add())

返回函数名:return inner

返回函数名加括号:return inner(),实在就是先执行inner函数,再将其返回值作为其余函数的返回值。

一个装饰器例子:

'''
1、@timer,称为语法糖,其作用是将被装饰函数add的函数名作为实参传给装饰器timer函数的形参func,传函数名现实传的是内存指向;
2、函数timer内又嵌套了inner函数,返回值是函数名inner,必须要明确的是,传进去函数名add,返回来inner函数名,效果就是add和inner配合指向在内存中界说inner的起始地址,而此时形参func指向在内存界说add的起始地址,可在调试程序过程中通过id方式打印查看add和inner所指向的内存地址的转变情形。
明确这两点,装饰器就不难理解了。
'''
# 加操作:无参数
import time


def timer(func):
    def inner():
        t1 = time.time()
        func()
        t2 = time.time()
        return t2 - t1

    return inner


@timer
def add():
    a = 1
    b = 1
    time.sleep(1)
    c = a + b
    print(c)
    return c


add = add()
print(add)
# 加操作:位置参数
import time


def timer(func):
    def inner(a, b):
        t1 = time.time()
        func(a, b)
        t2 = time.time()
        return t2 - t1

    return inner


@timer
def add(a, b):
    # a = 1
    # b = 1
    time.sleep(1)
    c = a + b
    print(c)
    return c


add = add(1, 1)
print(add)
# 加操作:可变参数
import time


def timer(func):
    def inner(*args):
        t1 = time.time()
        func(*args)
        t2 = time.time()
        return t2 - t1

    return inner


@timer
def add(a, b):
    # a = 1
    # b = 1
    time.sleep(1)
    c = a + b
    print(c)
    return c


add = add(1, 1)
print(add)
# 加减乘除操作:可变参数
import time


def timer(func):
    def inner(*args):
        t1 = time.time()
        func(*args)
        t2 = time.time()
        return t2 - t1

    return inner


@timer
def add(a, b):
    # a = 1
    # b = 1
    time.sleep(1)
    c = a + b
    print(c)
    return c


@timer
def plus(a, b):
    # a = 1
    # b = 1
    time.sleep(2)
    c = a - b
    print(c)
    return c


@timer
def multi(a, b):
    # a = 1
    # b = 1
    time.sleep(3)
    c = a * b
    print(c)
    return c


@timer
def div(a, b):
    # a = 1
    # b = 1
    time.sleep(4)
    c = a / b
    print(c)
    return c


add = add(1, 1)
print(add)
plus = plus(2, 1)
print(plus)
multi = multi(3, 1)
print(multi)
div = div(4, 1)
print(div)

敬请关注小我私家微信民众号:测试工匠麻辣烫

,

欧博手机

欢迎进入欧博手机版(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

AllBetGaming声明:该文看法仅代表作者自己,与本平台无关。转载请注明:allbet代理:Python3 装饰器剖析

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:653
  • 页面总数:0
  • 分类总数:8
  • 标签总数:978
  • 评论总数:238
  • 浏览总数:8664