python装饰器

知识点提取:

  1. 装饰器其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改
  2. 装饰器特性:装饰器是一个函数;这个函数内部至少有一个嵌套函数;这个函数或其内部函数, 至少有一个参数是函数对象(可调用);这个函数的返回值是函数对象(内部函数名)
  3. 用 @functools.wraps(func) 来保留原函数信息
  4. 实际工作中,装饰器通常运用在身份认证、日志记录、输入合理性检查以及缓存等多个领域中。

写一个简单的装饰器

def my_decorator(func):
    def wrapper():
        print("hello")
        func()
    return wrapper

@my_decorator
def greet():
    print("world")

#装饰器其实是这个函数
#greet = my_decorator(greet)

greet()

可传参的装饰器

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("hello")
        func(*args, **kwargs)
    return wrapper

@my_decorator
def greet(msg):
    print(msg)

#装饰器其实是这个函数
#greet = my_decorator(greet)

greet("world")

带有自定义参数的装饰器

def repeat(num): 
	def my_decorator(func): 
		def wrapper(*args, **kwargs): 
			for i in range(num): 
				print('wrapper of decorator') 
				func(*args, **kwargs) 
			return wrapper 
		return my_decorator
@repeat(4)
def greet(message): 
	print(message)
	
greet('hello world')
# 输出:wrapper of decoratorhello worldwrapper of decoratorhello worldwrapper of decoratorhello worldwrapper of decoratorhello world

装饰器的嵌套

@decorator1
@decorator2
@decorator3
def func():

它的执行顺序从里到外,所以上面的语句也等效于:
decorator1(decorator2(decorator3(func)))

import functools
def my_decorator1(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print('execute decorator1')
        func(*args, **kwargs)
    return wrapper

def my_decorator2(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print('execute decorator2')
        func(*args, **kwargs)
    return wrapper

@my_decorator1
@my_decorator2
def greet(message):
    print(message)

greet('hello world')

#输出:
# execute decorator1
# execute decorator2
# hello world

你可能感兴趣的:(python,python,开发语言)