Python 中提供了一个叫装饰器的特性,用于在不改变原始对象的情况下,增加新功能或行为。
这也属于 Python "元编程" 的一部分,在编译时一个对象去试图修改另一个对象的信息,实现 "控制一切" 目的。
本篇文章作为装饰器的基础篇,在阅读后应该了解如下内容:
- 装饰器的原理?
- 装饰器如何包裹有参数的函数?
- 装饰器本身需要参数怎么办?
- 被装饰器修饰的函数还是原函数吗,怎么解决?
- 装饰器嵌套时的顺序?
- 装饰器常见的应用场景?
装饰器原理
在具体装饰器的内容前,先来回顾下 Python 中的基本概念:
1. Python 中,一切都是对象,函数自然也不例外
python 中的对象都会在内存中用于属于自己的一块区域。在操作具体的对象时,需要通过 “变量” ,变量本身仅是一个指针,指向对象的内存地址。
函数作为对象的一种,自然也可以被变量引用。
def hello(name: str):
print('hello', name)
hello('Ethan')
alias_func_name = hello
alias_func_name('Michael')
# hello Ethan
# hello Michael
alias_func_name
作为函数的引用,当然也可以作为函数被使用。
2. 函数接受的参数和返回值都可以是函数
def inc(x):
return x + 1
def dec(x):
return x - 1
def operate(func, x):
result = func(x)
return result
operate(inc,3)
# 4
operate(dec,3)
# 2
这里 operate
中接受函数作为参数,并在其内部进行调用。
3. 嵌套函数
def increment():
def inner_increment(number):
return 1 + number
return inner_increment()
print(increment(100)) # 101
在 increment 内部,实现对 number add 1 的操作。
回头再来看下装饰器的实现:
# def decorator
def decorator_func(func):
print('enter decorator..')
def wrapper():
print('Step1: enter wrapper func.')
return func()
return wrapper
# def target func
def normal_func():
print("Step2: I