美文网首页
python修饰器

python修饰器

作者: AsdilFibrizo | 来源:发表于2019-08-21 22:13 被阅读0次
  • 介绍修饰器之前首先要介绍两个参数
*args和**kwargs
*args:是一个列表,传入的参数会被放进列表里
**kwargs:是一个字典,传入的参数以键值对的形式存放到字典里

def f(*args):
    print(args)
f(1, 3, 5)
[out]: (1, 3, 5)

def f(**kwargs):
    print(kwargs)
f(a=1,b=2,c =3)
[out]: {'a': 1, 'b': 2, 'c': 3}
  • 基础用法
import time
def f():
    start = time.clock()
    print("ok")
    end = time.clock()
    print("start:", start, " end:", end)
f()  
若有其它函数想要计算运行时间,则这样写很麻烦,这里引入修饰器
def runtime(func):
    def wrapper():
        start = time.clock()
        func()
        end = time.clock()
        print("start:", start, " end:", end)
    return wrapper
@runtime
def f():
    print("ok")
f()
  • 传递参数
# 将输出文件变为int
def toint(func):
    def wrapper(*args, **kwargs):
        ret = func(*args, **kwargs)
        ret = list(map(int, ret))
        return ret
    return wrapper
@toint
def f(a, b):
    assert isinstance(a, list)
    assert isinstance(b, list)
    a.extend(b)
    return a
print(f(['11','22','33'], [44,55,66]))
[out]: [11, 22, 33, 44, 55, 66]

*报错

若要使用修饰器修函数结果进行断言则可以使用下面的语句
def isint(func):
    def wrapper(*args, **kwargs):
        for each in args:
            assert isinstance(each, int), func.__name__ + '() 输出不为数字'
        for key in kwargs:
            assert isinstance(kwargs[key], int), func.__name__ + '() 输出不为数字'
        ret = func(*args, **kwargs)
        return ret
    # 将wrapper的docstring和名称设置成和原始函数一样,有利于内省(获得自身的信息)
    wrapper.__name__ = func.__name__
    wrapper.__doc__ = func.__doc__
    return wrapper
@isint
def f(a, b):
    return a+b
print(f('2',2))
[out]: AssertionError: f() 输出不为数字

这个修饰器可以简化 functools已经封装好了

import functools
def isint(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        for each in args:
            assert isinstance(each, int), func.__name__ + '() 输出不为数字'
        for key in kwargs:
            assert isinstance(kwargs[key], int), func.__name__ + '() 输出不为数字'
        ret = func(*args, **kwargs)
        return ret
    return wrapper
@isint
def f(a, b):
    return a+b
print(f('2',2))
[out]: AssertionError: f() 输出不为数字

相关文章

  • Python修饰器

    前话: python的修饰器可以说是python语言最有灵性的一个功能了,看到网上有各种乱乱的文章,所以想自己写得...

  • python修饰器

    介绍修饰器之前首先要介绍两个参数 基础用法 传递参数 *报错 这个修饰器可以简化 functools已经封装好了

  • python修饰器

    1 什么是装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。本质就是函数,功能就...

  • python修饰器

    1、参数args与kwargs: *args是元组,如def fun(args): pass 传过去的参数是元组形...

  • python 修饰器

    python编程时首次遇到@staticmethod,就开始了我的修饰器之路 下面链接作者写的很好 https:/...

  • Python基础手册25——装饰器

    一、装饰器 装饰器背后的主要动机源自 python 面向对象编程。装饰器是在函数调用之上的修饰。这些修饰仅是当声明...

  • Python 中修饰器

    修饰器就是一个返回函数的高阶函数 如果decorator本身需要传入参数,那就需要编写一个返回decorator的...

  • 谈谈python修饰器

    前言 对python的修饰器的理解一直停留在"使用修饰器把函数注册为事件的处理程序"的层次,也是一知半解;这样拖着...

  • Python修饰器模式

    修饰器模式,可以对一个函数、类添加一层封装。

  • Python函数修饰器

    假设我们写一个小函数,打印当前的时间和一个随机整数,代码如下: 运行的结果是: 假设,我们想周期性的打印随机数,而...

网友评论

      本文标题:python修饰器

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