温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python中修饰器的作用是什么

发布时间:2021-04-30 15:09:38 来源:亿速云 阅读:369 作者:Leah 栏目:编程语言

今天就跟大家聊聊有关python中修饰器的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

python有哪些常用库

python常用的库:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。

我们首先从一个简单的例子说起,这个例子是stackflow上的一个问题,如何通过使用如下的代码实现输出<b><i>Hello</i></b>:

@makebold  @makeitalic  def say():  
   return "Hello"

先看一下答案:

def makebold(fn):  
    def wrapped():  
        return "<b>" + fn() + "</b>"  
    return wrapped  
   
def makeitalic(fn):  
    def wrapped():  
        return "<i>" + fn() + "</i>"  
    return wrapped  
  
@makebold  
@makeitalic  
def hello():  
    return "hello world"  
     print hello()
     #返回 <b><i>hello world</i></b>

这里的@makebold和@makeitalic似乎给Hello加上了一层包装(or修饰),这就是修饰器最明显的体现。

从需求谈起

初期,我写了一个函数

def foo():  
    print 'in foo()'  foo()

为了检查这个函数的复杂度(在网络编程中程序的延时还是很重要的),需要测算运算时间,增加了计算时间的功能有了下面的代码:

import time  
def foo():  
    start = time.clock()  
    print 'in foo()'  
    end = time.clock()  
    print 'Time Elapsed:', end - start  
   
foo()

这里只是写了一个函数,如果我想测量多个函数的延时,由于必须知道start与end,所以必须写在程序的开头与结尾,难道每一个程序都这样复制粘贴么?固然可行,但是,我们可以通过设计模式中将功能与数据部分分离一样,将这个测量时间的函数分离出去,就像C++中我们可以将这个测量时间的函数变为一个类,通过调用这个类,赋予不同的函数来测量不同的函数的运行时长。在python中,由于函数实际上就是对象,所以可以利用类似的方法实现:

import time  
   
def foo():  
    print 'in foo()'  
   def timeit(func):  
    start = time.clock()  
    func()  
    end =time.clock()  
    print 'Time Elapsed:', end - start  
   
timeit(foo)

这里func()就可以指定函数了,但是如果我不想填这个函数或者这个功能函数并不能修改成类似的形式怎么办?我们需要的是最大限度的少改动:

import time     
def foo():      
    print 'in foo()'     
# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法  
def timeit(func):            
     # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装      
     def wrapper():          
         start = time.clock()          
         func()          
         end =time.clock()          
         print 'Time Elapsed:', end - start             
 # 将包装后的函数返回      
     return wrapper     
 foo = timeit
 (foo)   
 #可以直接写成@timeit + foo定义,python的"语法糖"foo()
 #在这个代码中,timeit(foo)不是直接产生调用效果,而是返回一个与foo参数列表一致的函数,此时此foo非彼foo!因为此时的foo具有了timeit的功效,简单来说就是能够让你在装饰前后执行代码而无须改变函数本身内容,装饰器是一个函数,而其参数为另外一个函数。
 #一个有趣的"汉堡"让你了解顺序
 #顺序在修饰器还是非常重要的,利用一个代码展示一下:
def bread(func) :      
    def wrapper() :          
        print "</'''       '''\>"          
        func()          
        print "<\______/>"      
    return wrapper     
def ingredients(func) :      
    def wrapper() :          
        print "#tomatoes#"          
        func()          
        print "~salad~"      
    return wrapper     
def sandwich(food="--ham--") :      
    print food     
    sandwich()  
#输出 : --ham--  sandwich = bread(ingredients(sandwich)) 
 sandwich() 
  #输出:  #</'''       '''\>  
   #tomatoes# 
   # --ham--
   # ~salad~ 
   #<\______/>

加上语法,代码可以更简洁:

def bread(func) :  
    def wrapper() :  
        print "</'''       '''\>"  
        func()  
        print "<\______/>"  
    return wrapper  
   
def ingredients(func) :  
    def wrapper() :  
        print "#tomatoes#"  
        func()  
        print "~salad~"  
    return wrapper  
@bread  
@ingredients  
def sandwich(food="--ham--") :  
    print food  
   
sandwich()


看完上述内容,你们对python中修饰器的作用是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI