首页 > 编程语言 > 详细

Python基础 装饰器

时间:2019-05-31 18:01:11      阅读:105      评论:0      收藏:0      [点我收藏+]

装饰器(decorator)

  1. 函数基础
    # function.py  函数
    # 1)函数是对象
    def hello():
        return Hello, world!
    
    func = hello
    print(func)  # <object>
    print(func())
    
    
    # 2)函数可以嵌套,定义在另一个函数内部
    def show():
        print(Run in show())
        def message(word=Hello):
            return word
        print(message())
    
    show()
    
    
    # 3)函数作为参数返回
    def getWordType(kind=‘‘):
        def default(word=‘‘):
            return word
        def upper(word=‘‘):
            return word.upper()
        def lower(word=‘‘):
            return word.lower()
    
        if kind.lower() == lower:
            return lower
        elif kind.lower() == upper:
            return upper
        else:
            return default
    
    wordType = getWordType(upper)
    print(wordType)
    print(wordType(Resistance is futile!))
    
    
    # 4)函数作为参数传入
    def getName(name=leo):
        return name
    
    def foo(func):
        print(I will call the getName function later)
        print(func())
    
    foo(getName)

     

  2. 装饰器以及函数比较
    # decorator.py  装饰器
    # 不使用装饰器情况
    def my_new_decorator(a_function_to_decorator):
        def the_wrapper_around_the_original_function():
            print(Befor the function runs)
            a_function_to_decorator()
            print(After the function runs)
        return the_wrapper_around_the_original_function  # 将函数作为参数返回
    
    
    def a_stand_alone_function():
        print("I‘m a stand alone function, don‘t you dare modify me.")
    
    
    a_stand_alone_function()
    a_stand_alone_function_decorated = my_new_decorator(a_stand_alone_function)  # 将函数作为参数传入
    print(a_stand_alone_function_decorated)
    a_stand_alone_function_decorated()
    
    # 使用装饰器 语法糖"@"
    @my_new_decorator
    def another_stand_alone_function():
        print(leave me alone)
    
    
    another_stand_alone_function()
    # same as: another_stand_alone_function = my_new_decorator(another_stand_alone_function)

     

  3. 装饰器应用
    # decorator_web.py  web中的装饰器应用
    def makebold(func):
        def wrapper():
            return <b> + func() + </b>
        return wrapper
    
    def makeitalic(func):
        def wrapper():
            return <i> + func() + </i>
        return wrapper
    
    @makebold
    @makeitalic
    def word():
        return Hello, decorator!
    
    
    print(word())
    # decorator_time.py  使用装饰器检查函数的运行时间
    import time
    import os
    
    
    def timer(func):
        def wrapper(cwd):
            time_begin = time.ctime()
            print(Begin @ + time_begin)
            func(cwd)
            time_end = time.ctime()
            print(End @ + time_end)
    
            print(Begin @ + time_begin)
            print(End @ + time_end)
        return wrapper
    
    
    @timer
    def walk(cwd=rD:\PyCharm\python\practice):
        for root, dirs, files in os.walk(cwd):
            # print(root)  # 打印当前目录下的所有子目录的绝对路径
            # print(dirs)  # 打印每个目录下的子目录列表
            # print(files)  # 打印所有目录下文件列表
            print(root)
            for file in files:
                print(\t + file)
    
    
    walk(cwd=rD:\PyCharm)

     

  4. 包含所有参数以及带返回值的装饰器
    # decorator_args.py  包含所有参数的装饰器
    import time
    def timer(func):
        def inner(*args, **kwargs):
            start = time.time()
            re = func(*args, **kwargs)
            end = time.time()
            return re
        return inner
    
    
    @timer  #==> func1 = timer(func1)
    def func1(a, b):
        print(in func1)
        return a, b
    
    
    @timer #==> func2 = timer(func2)
    def func2(a):
        print(In func2 and get, a)
        return func2 over
    
    
    func1(aaaaaa, bbbbbb)
    print(func2(aaaaaa))

     

  5. 使被装饰的函数能够使用正常函数方法
    # decorator_method.py
    from functools import wraps
    
    def deco(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)
        return wrapper
    
    @deco
    def index():
        ‘‘‘docs here in decorator‘‘‘
        print(from index)
    
    
    index()
    print(index.__name__)
    print(index.__doc__)

     

Python基础 装饰器

原文:https://www.cnblogs.com/noonjuan/p/10956619.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!