python基础16_装饰器

不了解是否其他语言也有类似 python 装饰器这样的东西。

#!/usr/bin/env python
# coding:utf-8

# 复习一下函数作为参数传递。
# def f11():
#     print(12345)
#
#
# def f12(xxx):
#     xxx()
#
#
# f12(f11)

## 装修器:本质就是函数,功能是为其他函数添加附加功能
# 原则:
# 1. 不修改被装饰函数的源代码
# 2. 不修改被修饰函数的调用方式

## 装饰器 = 高阶函数 + 函数嵌套 + 闭包

def outer(func):
    def inner():
        print('log')
        ret = func()
        print('after')
        return ret
    return inner



@outer
def f1():
    print('F1')
    return '砍你哦.'

@outer
def f2():
    print('F2')


@outer
def f100():
    print('F100')

在另一个文件中调用上面定义的函数,看看装饰器是否启作用:

#!/usr/bin/env python
# coding:utf-8

import outer01

outer01.f1()
outer01.f2()
outer01.f100()

装饰器简单原理:

#!/usr/bin/env python
# coding:utf-8

def outer(func):
    def inner():
        print('before')
        func()
        print('after')
    return inner


## 格式 @ + 函数名
## 功能:
#   1. 自动执行outer函数并且将其下面的函数名f1当作参数传递。
#   2. 将outer函数的返回值,重新赋值给f1
@outer
def f1():
    print('F1')

# 一旦函数被装饰器装饰,函数就会被重新赋值成装饰器函数的内层函数
f1()

换一个文件调用函数:

#!/usr/bin/env python
# coding:utf-8


import outer01

res = outer01.f1() # 也拿到了原函数的返回值。

print(res)

猜你喜欢

转载自www.cnblogs.com/frx9527/p/decorator.html