手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Python装饰器基础知识

[日期:2018-08-25] 来源:Linux社区  作者:Linux [字体: ]

装饰器:本质是函数(装饰其他函数)就是为其他函数添加附加功能

原则:

1、不能修改被装饰的函数的源代码

2、不能修改被装饰的函数的调用方式

装饰器对其被装饰的函数是完全透明的

基础知识

1、函数即“变量”   定义一个函数相当于就是把函数体赋值给函数名

def test():

    pass

test -->>'函数体'

2、高阶函数 

1、把一个函数名当作实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能) 2、返回值中包含函数名(不修改函数的调用方式)

import  time
def  bar():
    time.sleep(3)
    print('in the bar')

def test1(func):
    start_time = time.time()
    func()  #run bar
    stop_time = time.time()
    print('the fun run time is %s' %(stop_time-start_time))


test1(bar)
bar()

import  time
def bar():
    time.sleep(3)
    print('in the bar')


def test2(func):
    print(func)
    return func

test2(bar)

bar = test2(bar)
bar()

 

3、嵌套函数

foo():
    ()
    bar():
        ()
    bar()

foo() 

高阶函数+嵌套函数 =》装饰器

1、不带参数的装饰器

import time

def timer(func):  #timer(test1)  func=test1

    def deco():
        start_time = time.time()
        func()  #run test1
        stop_time = time.time()
        print('the fun run time is %s' %(stop_time-start_time))
    return deco

@timer  #test1 = timer(test1)  等同于这个,得到的是deco函数的返回值
def test1():
    time.sleep(3)
    print('in the test1')


test1()  #--->deco

代码执行过程

1、导入模块

2、def timer(func)

3、@timer   自动执行将test1传递给timer函数执行,之后返回deco函数的返回值

4、当执行到test1()函数时候,跳转到deco函数去执行

2、带参数的装饰器

import time

def timer(func):  #timer(test1)  func=test1

    def deco(arg1):
        start_time = time.time()
        func(arg1)  #run test1
        stop_time = time.time()
        print('the fun run time is %s' %(stop_time-start_time))
    return deco

@timer  #test1 = timer(test1)  等同于这个
def test1(name):
    time.sleep(3)
    print('in the test1',name)


test1('martin')  #--->deco(‘martin’)

import time

def timer(func):  #timer(test1)  func=test1

    def deco(*args,**kwargs):
        start_time = time.time()
        func(*args,**kwargs)  #run test1
        stop_time = time.time()
        print('the fun run time is %s' %(stop_time-start_time))
    return deco

@timer  #test1 = timer(test1)  等同于这个
def test1():
    time.sleep(3)
    print('in the test1')

@timer
def test2(name,age):
    time.sleep(3)
    print('in the test2',name,age)

#test1 = timer(test1)
print(test1)
test1()  #--->deco
test2('martin',18) 

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2018-08/153714.htm

linux
相关资讯       Python装饰器 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款