python装饰器

Arya Lv3

前言💟

最近看到一个很久以前的中型项目,可能由于一开始没有怎么规划过,想到啥功能就写啥功能,后来又随着功能的增加,代码堆成了一座“屎山”。正好最近的事情不多,我又想巩固一下python基础,于是我打重构一下这座“屎山”。上网查了一些资料之后,刷到了装饰器这个概念,学习之后总结了一些笔记。
python代码简洁书写参考

基本函数装饰器(Decorator)🎀

Python装饰器的概念

装饰器是一个特殊的函数,它可以扩展一个普通函数的功能,可以把装饰器中定义的功能辅助于所有被装饰的函数,提高代码的复用率,让代码更简洁。

装饰器的基本定义

装饰器有自己的功能代码,并且传递一个函数作为参数到装饰器中(回调函数)进行调用。

1
2
3
4
5
6
def decorator(callback):        
@wraps(callback) #wraps对回调函数进行装饰,让我们可以访问被装饰前函数的属性
def func():
#装饰器自己的功能代码
callback() #回调函数,调用回调函数,执行被装饰函数的代码
return func

使用装饰器

1
2
3
4
5
6
@decorator
def decorated_func():
pass
#普通函数功能代码

decorated_func() #调用被装饰的函数

装饰带参数的函数(传递变量)🔃

装饰带参数的函数,不在被装饰的函数调用时中传递参数,而是在装饰器中的回调函数中传递参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def calculate(callback):
#计算1+2+...+50
def run():
result=0
for n in range(51):
result+=n
callback(result) #将参数传递到普通函数中
return run

@calculate
def show(n):
print("计算结果是:",n) #得到装饰器中的参数(可以通过传递参数得到装饰器内的变量值)

@calculate
def showInEnglish(n):
print("The Result is:",n) #相同参数输送给不同的函数,重复利用装饰器逻辑

show()
showInEnglish()

带参数的装饰器(Decorator Factory)🏭

装饰器工厂的概念

通过调用装饰器工厂这个函数生成一个装饰器,然后返回装饰器来使用。

基本定义

1
2
3
4
5
6
7
def decorator_factory(argument,argument):
def decorator(callback):
def func():
#装饰器自己的功能代码
callback()
return func
return decorator

使用

1
2
3
4
5
@decorator_factory(arg,arg)
def decorated_func():
pass
#普通函数功能代码
decorated_func()

装饰器和类🆒

装饰器类

给被装饰函数提供类进行装饰,在调用@xxxx时自动创建类对象,初始化的时候传入回调函数,call方法执行回调函数

定义

1
2
3
4
5
6
class Decorator:
def __init__(self,callback):
self.func=callback
def __call__(self):
#装饰器类自己的功能代码
self.func()

使用

1
2
3
4
5
@Decorator
def decorated_func():
#普通函数功能代码

decorated_func()

带参数的装饰器类

给被装饰函数提供类对象进行装饰,在被装饰函数执行的时候调用__call__,传入回调函数

1
2
3
4
5
6
7
8
9
10
11
12
13
class ParamDacorator:
def __init__(self,name):
self.name=name
def __call__(self,callback):
def run():
#装饰器的功能代码
print(name)
callback()
return run
@ParamDacorator("Jack")
def decorated_func():
pass
decorated_func()

用装饰器装饰类

扩充、修改、限制类的功能。

定义

装饰器函数的参数是指需要装饰的类,在调用类创建对象时,拿到的不是类而是装饰器的返回值。下面是执行装饰器代码并创建类对象的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
def class_decorator(cls):
def run():
print("start")
obj=cls()
print("end")
return obj
return run

@class_decorator
class Person:
pass

p1=Person()

参考来自:
彭彭装饰器基本篇教程
彭彭装饰工厂教程
高级python编程知识,类与装饰器

  • 标题: python装饰器
  • 作者: Arya
  • 创建于 : 2023-11-16 18:00:00
  • 更新于 : 2023-11-20 15:11:06
  • 链接: https://aryagala0.github.io/2023/11/16/python基础/python装饰器/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论