美文网首页python
python装饰器

python装饰器

作者: 苦海飘摇 | 来源:发表于2020-05-09 17:01 被阅读0次
在python3中 迭代器 生成器 装饰器 理解比较难

1、装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象,装饰器的本质是函数,主要用来装饰其他函数,也就是为其他函数添加附加功能

2、装饰器的原则:
(1) 装饰器不能修改被装饰的函数的源代码
(2) 装饰器不能修改被装饰的函数的调用方式

函数

(1)装饰器的原型

import time
def showtime(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print('spend is {}'.format(end_time - start_time))
 
    return wrapper
 
def foo(): #原函数不可以改变
    print('foo..')
    time.sleep(3)
 
foo = showtime(foo)
foo()

(2)不带参数的装饰器:(装饰器,被装饰函数都不带参数)

import time
def showtime(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print('spend is {}'.format(end_time - start_time))
 
    return wrapper
 
@showtime     #foo = showtime(foo)
def foo():
    print('foo..')
    time.sleep(3)
 
@showtime     #doo = showtime(doo)
def doo():
    print('doo..')
    time.sleep(2)
 
foo()
doo()
  • 语法:@
  • 装饰器便捷方法在 函数体上方写@showtime 与 foo = showtime(foo)相同

(3)带参数的被装饰的函数

import time
def showtime(func):
    def wrapper(a, b):
        start_time = time.time()
        func(a,b)
        end_time = time.time()
        print('spend is {}'.format(end_time - start_time))
 
    return wrapper
 
@showtime #add = showtime(add)
def add(a, b):
    print(a+b)
    time.sleep(1)
 
@showtime #sub = showtime(sub)
def sub(a,b):
    print(a-b)
    time.sleep(1)
 
add(5,4)
sub(3,2)

(4)带参数的装饰器(装饰函数)

import time
def time_logger(flag = 0):
    def showtime(func):
        def wrapper(a, b):
            start_time = time.time()
            func(a,b)
            end_time = time.time()
            print('spend is {}'.format(end_time - start_time))
            
            if flag:
                print('将此操作保留至日志')
 
        return wrapper
 
    return showtime
 
@time_logger(2)  #得到闭包函数showtime,add = showtime(add)
def add(a, b):
    print(a+b)
    time.sleep(1)
 
add(3,4)

(5)装饰器语法总结

def myDecorator(...):    #定义装饰器,可能带参数
     def decorator(func):    #装饰器核心,以被装饰的函数对象为参数,返回装饰后的函数对象
         def wrapper(*args, **kvargs):    #装饰的过程,参数列表适应不同参数的函数
             ...    #修改函数调用前的行为
             func(*args, **kvargs)    #调用函数
             ...    #修改函数调用后的行为
         return wrapper
     return decorator
 
@myDecorator(...):    #给函数加上装饰器
def myFunc(...):      #自己定义的功能函数
    ...
类 (class)

Python内置装饰器

在Python中有三个内置的装饰器,都是跟class相关的:staticmethod、classmethod 和property。

  • staticmethod 是类静态方法,其跟成员方法的区别是没有 self 参数,并且可以在类不进行实例化的情况下调用
  • classmethod 与成员方法的区别在于所接收的第一个参数不是 self (类实例的指针),而是cls(当前类的具体类型)
  • property 是属性的意思,表示可以通过通过类实例直接访问的信息
import time
class Foo(object):
    def __init__(self, func):
        self._func = func
 
    def __call__(self):
        start_time = time.time()
        self._func()
        end_time = time.time()
        print('spend is {}'.format(end_time - start_time))
 
@Foo  #bar = Foo(bar)
def bar():
    print('bar..')
    time.sleep(2)
 
bar()

相关文章

  • 装饰器模式

    介绍 在python装饰器学习 这篇文章中,介绍了python 中的装饰器,python内置了对装饰器的支持。面向...

  • python中的装饰器

    python装饰器详解 Python装饰器学习(九步入门) 装饰器(decorator) 就是一个包装机(wrap...

  • [译] Python装饰器Part II:装饰器参数

    这是Python装饰器讲解的第二部分,上一篇:Python装饰器Part I:装饰器简介 回顾:不带参数的装饰器 ...

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • Python进阶——面向对象

    1. Python中的@property   @property是python自带的装饰器,装饰器(decorat...

  • Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方

    Python 装饰器简介装饰器(Decorator)是 Python 非常实用的一个语法糖功能。装饰器本质是一种返...

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

  • 2019-05-26python装饰器到底是什么?

    装饰器例子 参考语法 装饰器是什么?个人理解,装饰器,是python中一种写法的定义。他仍然符合python的基本...

  • 2018-07-18

    Python装饰器 装饰,顾名思义,是用来打扮什么东西的。Python装饰...

网友评论

    本文标题:python装饰器

    本文链接:https://www.haomeiwen.com/subject/wxaknhtx.html