一个函数装饰器

简介:

Python的函数是对象

Python  函数可以被赋值def  hello():print(‘hello!’)

a = hello       #注: 此处没有() ,是一个对象

a()        # 调用a() 结果与hello() 相同

此时删除 helloa() 依然保持原属性

wKioL1mf0fuwPNHkAAK6GPgPjYw317.png-wh_50

函数可以定义在另一个函数里面


def say():

    def hello():

        return 'hello'

    return hello

外层的say函数会把内层的 hello函数的执行结果输出

wKioL1mf3RuAY6NvAADR-K5E2aI540.png-wh_50


函数可以返回一个函数

wKiom1mf3SrRdF3ZAAIG15bbVfc046.png-wh_50


可以将一个函数当作参数传递

wKioL1mf3R6i2OmzAAE_g3Ew4zk685.png-wh_50


书写一个装饰器


def  oneDecorator(oneFunction):

def  oneWrapper():

print ‘before’

oneFunction()

print  ‘after’

return  oneWrapper


def  sayHello():

  print  ‘hello’


run  =  oneDecorator(sayHello)

run()


示例1

wKiom1mf3SvRm9B0AAEupAAUwqM283.png-wh_50

wKioL1mf3R-DqpRuAAC6cOnlSYA317.png-wh_50

示例2

wKiom1mf3S3z6iZ3AANhWB69G5Q966.png-wh_50


装饰器经典模式à累加装饰器

wKioL1mf3SGzZtjvAAIWJuoTpvg403.png-wh_50

wKiom1mf3TDRnPP0AAEDXQmENs8683.png-wh_50

上例通过函数直接调用可写成

run  =  towDecorator(oneDecorator(sayHello))

注:被装饰的函数不写括号,代表返回的是一个对象,然后通过对象()的方式运行

run()



装饰器传递参数

只需要让包装函数传递参数即可

def  oneDecoration(oneFunction):

    def   wrapper(arg1, arg2):

        print(‘=’ * 50)

        oneFunction(arg1, arg2)

        print(‘=’ * 50)

    return  wrapper


示例

wKiom1mf37XzV0GGAAHa15Jm40c538.png-wh_50

wKioL1mf36jhBSO1AACMzwNHaRA463.png-wh_50


使用装饰器装饰一个类中的方法


构建装饰器的时候,需要考虑self,所以在传参的时候,包装函数除了需要传递函数的参数,还要传递一个self参数

例:

def  oneDecration(onefunction):

    def  wrapper(self, args1, args2):

        print(‘=’* 50)

      oneFunction(self, args1, args2)

      print(‘=’ * 50)

    return  wrapper


其它与上例无异,这里不再作演示



一个更为通用的装饰器


def  oneDecration(onefunction):

    def  wrapper(*args,  **kwargs):

         print(‘=’ * 50)

      oneFunction(*args, **kwargs)

      print(‘=’ * 50)

    return  wrapper

@oneDecration

def  sayHello(name1, name2, name3):

      print(‘{}: hello, {}, {}’.format(name1,name2,name3))

@oneDecration

def  sayHello1():

    print(‘hello’)

sayHello1()

sayHello(‘Tom’,‘Jerry’, ‘Jim’)



wKiom1mf37bQAt87AAIS-ffGDss179.png-wh_50

wKiom1mf37eBMCxEAAERpI8-Hg4950.png-wh_50




装饰器一般格式


import   functools

def   装饰器名(fun):

    @functools.wraps(fun)

    def  wrapper(*args, **kwargs):

        dosomething

        fun(*args, **kwargs)

    return  wrapper


本文转自   tianshuai369   51CTO博客,原文链接:http://blog.51cto.com/songqinglong/1959364

相关文章
|
6天前
|
Java 测试技术 Python
为什么要用函数
在编程中,函数是一种重要的抽象工具,它使我们能够组织和复用代码,提高代码的可读性、可维护性和效率。函数允许我们将一段代码块封装起来,给它一个名字,并通过参数和返回值来与外部世界交互。下面,我们将深入探讨为什么要使用函数,并附上相应的代码示例。
16 1
|
9月前
|
C语言
C语言知识点之 函数2
C语言知识点之 函数2
32 0
|
6天前
|
开发工具 Windows
GetMessage()函数使用时的注意
GetMessage()函数使用时的注意
32 0
|
5月前
|
存储 程序员 C语言
函数(1)
函数(1)
54 0
|
5月前
|
人工智能
函数练习
用菜单的形式分别选择百钱买百鸡,九九表,水仙花数。
24 0
|
11月前
实现strcta函数
实现strcta函数
|
算法 程序员 C++
C/C++ 中的 strrchr() 函数
strrchr() 函数 在 C++ 中,strrchr() 是用于字符串处理的预定义函数。cstring 是字符串函数所需的头文件
255 0
|
算法 编译器
函数(二)
函数(二)
59 0
函数(二)