美文网首页
python装饰器详解

python装饰器详解

作者: 四十是似时 | 来源:发表于2018-03-04 14:39 被阅读0次

本文来自我的博客


引入装饰器的思想:

如果我们想为某一个功能添加一个新的功能,如何在不改变他的原来的函数名的情况下实现呢?

我们可能会这样:

1.直接在原来的函数里头添加功能模块 --- 代码量太大逐一添加不太现实

2.再写一个新的函数,在原来的函数里分别调用 --- 如果原来的函数在多处调用,且太过分散,工程量太大

3.定义一个新的函数:

def cover():

newFunc()

oldFunc()

在新函数里头注入一个参数为 -- 原来的函数(函数作为参数传入)

def cover(oldFunc)  -- 此处不能有括号否则为调用函数

newFunc()

oldFunc()

cover(oldFunc)  -- 调用

那么这样又违背了题意 --- 显然不合格

上述的三种方法都不能实现,那么装饰器的思想应运而生

即在第三种方法的理念下,既添加了新功能,有没有修改名字

def covered(func):

def cover():

newFunc()

oldFunc()

return cover

即: cover = covered(oldFunc)

cover()  ">="  oldFunc()

调用oldFunc 就可以写作调用cover()

cover()函数是oldFunc()函数的增强版

实现换皮不换肉,还变肥的操作

我们重新归纳:

def newFunc():

    print("需要添加的新功能")

def outter(fun):

    def inner(name):

        newFunc()

        return fun(name)

    return  inner

# 在一个函数上加上@,表示使用装饰器,@符号后跟的是 装饰器的函数名

# 如: @outter  相当于执行了  func = outter(func)  --->   将inner修改成原函数名 = 装饰器函数名(需要添加新功能的原函数名)

@outter

def func(name):

    print("%s的基础功能"%name)

    return name

print(func("胖胖"))  #inner("胖胖") 注意此处的func与原来的并不是一样的,而是改装后名字一样而已

这就是装饰器的基本思想,那么如何实现一个通用的装饰器呢?即实现一个通用的装饰器,起始也很简单只需要在传参上修改就行:

[python] view plain copy

def newFunc():  

print("需要添加的新功能")  

def outter(fun):  

def inner(*args,**kwargs):  

newFunc()# 如果有必要,可以在新功能出也添加  

return fun(*args,**kwargs)  

return  inner  

@outter  

def func(name,food):  

print("%s的基础功能是吃%s"%(name,food))  

return name  

print(func("小贱贱","面包")) #<==> print(inner("小贱贱","面包"))  

我们来看看具体应用:

一.创建一个装饰器把下面函数输出的字符串首字母大写

# 思路: 使用装饰器,装饰器可以给原函数重新命名,添加新的功能

#       可以在装饰器里给新旧函数排序使得旧函数有新的功能

# def geeting(word="hi there"):

#    return word.lower()

[python] view plain copy

#解答:  

def newGeeting(word):  

return word.capitalize()  

def change(geet):  

def geetings(**kwargs):  

        geet(**kwargs)  

return newGeeting(**kwargs)  

return geetings  

@change  

def geeting(word="hi there"):  

return word.lower()  

print(geeting(word="hi there"))  

二.使用一个装饰器,查看函数运行时间

# 思路:运行时间 导入时间模块,在装饰器内部 函数前后分别获取当前时间戳,函数运行结束后,差值就是函数运行时间

[python] view plain copy

#解答:  

import time  

def time1(func):  

def newFunc():  

        startTime = time.time()  

        func()  

        endTime = time.time()  

return endTime-startTime  

return newFunc  

@time1  

def oldFunc():  

time.sleep(2)  

print("我正在运行中")  

print(oldFunc())  

那么装饰器就说到这里,你是否有所收获呢?

相关文章

  • python 装饰器

    参考链接:详解Python的装饰器

  • python中的装饰器

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

  • Python装饰器的另类用法

    原文出处: cicaday 之前有比较系统介绍过Python的装饰器(请查阅《详解Python装饰器》),本文算是...

  • java动态代理,python装饰器

    原文:java的动态代理机制详解 - xiaoluo501395377 - 博客园 python装饰器

  • 学习记录

    Python基础中的高级专题装饰器详解:https://www.bilibili.com/video/av1275...

  • python装饰器详解

    本文来自我的博客 引入装饰器的思想: 如果我们想为某一个功能添加一个新的功能,如何在不改变他的原来的函数名的情况下...

  • python 装饰器详解

    前言 这篇文章打算写下关于python3中装饰器的一些认识,提高一下知识水平 1 装饰器是啥 装饰器本质上是一个 ...

  • 详解Python装饰器

    基础 注意:函数名、函数加括号(函数的返回值)可以被当做参数传递,也可以被当做返回值return 内部原理 把wr...

  • python——装饰器详解

    一、装饰器概念 1、装饰器 装饰器:一种返回值也是一个函数的函数,即装饰器。 2、装饰器目的 装饰器的目的:装饰器...

  • python装饰器详解

    一、什么是装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外...

网友评论

      本文标题:python装饰器详解

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