python几种装饰器的用法

用函数装饰函数

这种比较常见首先定义装饰器函数

def cache(func):
    data = {}
    @wraps(func)
    def wrapper(*args, **kwargs):
        key = f‘{func.__name__}-{str(args)}-{str(kwargs)})‘
        if key in data:
            result = data.get(key)
            print(‘cache‘)
        else:
            result = func(*args, **kwargs)
            data[key] = result
            print(‘calculated‘)
        return result
    return wrapper

然后定义一个需要装饰的函数

@cache
def add(a, b):
    return a + b

调用add。

print(add(2, 4))
print(add(2, 4))

输出

add-(2, 4)-{})
calculated
6
add-(2, 4)-{})
cache
6

用类装饰函数

# -*- coding: utf-8 -*-
# @Time : 2018/9/26 23:30
# @Author : cxa
# @File : cache.py
# @Software: PyCharm

class Cache:
    def __init__(self, func):
        self.data = {}
        self.func = func

    def __call__(self, *args, **kwargs):
        key = f‘{self.func.__name__}-{str(args)}-{str(kwargs)})‘
        print(key)
        data = self.data
        if key in data:
            result = data.get(key)
            print(‘cache‘)
        else:
            result = self.func(*args, **kwargs)
            data[key] = result
            print(‘calculated‘)
        return result

然后定义一个需要装饰的函数

@Cache
def add(a, b):
    return a + b

调用add。

print(add(2, 4))
print(add(2, 4))

输出

add-(2, 4)-{})
calculated
6
add-(2, 4)-{})
cache
6

类装饰类的方法

一个装饰器类

# -*- coding: utf-8 -*-
# @Time : 2018/9/26 23:30
# @Author : cxa
# @File : cache.py
# @Software: PyCharm

class Cache:
    def __init__(self, func):
        self.data = {}
        self.func = func

    def __call__(self, *args, **kwargs):
        key = f‘{self.func.__name__}-{str(args)}-{str(kwargs)})‘
        print(key)
        data = self.data
        if key in data:
            result = data.get(key)
            print(‘cache‘)
        else:
            result = self.func(*args, **kwargs)
            data[key] = result
            print(‘calculated‘)
        return result

然后定义一个需要装饰的类,装饰add方法

class FuncDemo():
    def __init__(self,w,h):
        self.w=w
        self.h=h

    @property
    @Cache
    def add(self):
        return self.w+self.h

调用并输出

add-(<__main__.FuncDemo object at 0x036D4F50>,)-{})
calculated
7
add-(<__main__.FuncDemo object at 0x036D4F50>,)-{})
cache
7

原文地址:https://www.cnblogs.com/c-x-a/p/9710894.html

时间: 2024-11-01 12:57:56

python几种装饰器的用法的相关文章

Python笔记之装饰器(decorator)

python 中一切皆对象,变量是对象,函数也是对象 def  funcName(): return 1 f = funcName                #funcName 是一个函数名,也是一个对象的名字,所以也可以赋值给一个变量,将对象funcName赋值给变量f f()   #  通过变量f来实现函数funcName函数的调用执行,f()=funcName() 装饰器本质上也是一个函数,作用是可以不修改原有代码的基础上去扩展现有函数功能.它的原理就是讲原函数对象作为参数传递给装饰器

【Python基础】装饰器的解释和用法

装饰器的用法比较简单,但是理解装饰器的原理还是比较复杂的,考虑到接下来的爬虫框架中很多用到装饰器的地方,我们先来讲解一下. 函数 我们定义了一个函数,没有什么具体操作,只是返回一个固定值 请注意一下缩进 def sample(): return 1 print(sample()) 作用域 函数内部的变量和函数外的变量是不同的 我们看一下下面的例子,locals()和globals()方法会得到局部变量和全局变量 我们可以在函数中调用全局变量,但是无法在函数中改变全局变量的值 global_str

六、PYTHON 学习之装饰器使用

Python是一种强大的语言,即可浅尝辄止,也可深入挖掘.很适合做科学计算.数据挖掘等等.今天我将简单介绍一下Python的装饰器(Decorators)的用法 . 假设我们想要庆祝下生日,需要邀请一些朋友过来参加.但是你有个讨厌的朋友,叫Joe,必须不能让他来啊.可能首先你想到的是建一个list,然后迭代查找并移除所有的Joe童鞋.这当然是个好方法,但是这里为了介绍装饰器,我们会用@来完成这个工作.虽然可能看起来没有什么必要,但是有助于大家学习装饰器的用法. 首先创建一个Python文件app

python高级之装饰器

python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之一的函数就是高阶函数: 接受一个或多个函数作为输入参数 输出一个函数 首先理解一个概念:函数名其实也是一个变量,一个函数其实就是一个对象,函数名就是对这个对象的引用.所以函数名也就和一个普通变量一样可以被当做函数的变量进行传递,当然也能够把函数名当做一个变量进行返回. 举个栗子: 1 def foo

Python深入05 装饰器

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 装饰器最早在Python 2.5中出现,它最初被用于加工函数和方法这样

Python单元测试--使用装饰器实现测试跳过和预期故障

Python单元测试unittest中提供了一下四种装饰器实现测试跳过和预期故障.(使用Python 2.7.13) 请查考Python手册中: https://docs.python.org/dev/library/unittest.html The following decorators implement test skipping and expected failures: #以下装饰器实施测试跳过和预期故障: @unittest.skip(原因) Unconditionally s

一段小代码说明@property装饰器的用法

#coding:utf-8 """ 一段小代码说明@property装饰器的用法.__name是私有变量 外部不能通过foo.__name访问,但可以通过foo._Foo__name访问. 如果想通过点运算符设置和访问实例属性怎么办,@property派上用途了, 先将一个方法头上加上@property,这个方法就变成实例属性了,再加上这个@get_name.setter 装饰器(@属性名.setter)就可以通过赋值来设置属性. python北京周末培训班 https://

十、PYTHON 学习之装饰器加深理解

在第六章已经有所介绍,这里看到一篇比较好的文章转过来. 基本概念 装饰器是23z种设计模式之一,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理, Web权限校验, Cache等. 很有名的例子来理解,咖啡,加糖的咖啡,加牛奶的咖啡. 本质上,还是咖啡,只是在原有的东西上,做了"装饰",使之附加一些功能或特性. 例如记录日志,需要对某些函数进行记录 笨的办法,每个函数加入代码,如果代码变了,就悲催了 装饰器的办法,定义一个专门日志记录的装饰器,对需要的函数进行装饰.

Python进阶之装饰器

函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一个参数传递或返回.同时,函数体中也可以再定义函数. 装饰器本质 可以通过编写一个纯函数的例子来还原装饰器所要做的事. def decorator(func):          def wrap():         print("Doing someting before executing fu